我想要以下代码来生成类似于代码下方的结构。我没有从代码中得到它。
我希望代码创建一个 3D 动态数组来保存数据,如下所示,这样当我想打印一个特定的字符串时 printf("%s\n",szData[2][3]) ;
我得到 "string4"
。另外,我想从特定位置获取特定字符,例如 putchar(szData[0][3][2]
我得到 'r'
。
尽管指定了位置,但下面的代码会打印出最后保存的数据。例如 printf("%s",szData[0][0]);
应该是 "string1"
它打印出 "string2"
是 szData[2][1]
的数据。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char***szData;
char temp[500];
int i,j,k,x,n,m,index;
printf("Rows:");
scanf("%d",&n);
szData=(char***)malloc(n*sizeof(char));
for(i=0;i<n;i++){
printf("Col: ");
scanf("%d",&m);
szData[i]=(char**)malloc(m*sizeof(char));
for(j=0;j<m;j++){
printf("string[%d][%d]=",i,j);
scanf("%s",temp);
szData[i][j]=(char*)malloc(25*sizeof(char));
szData[i][j]=temp;
}
}
printf("memmory[%d][%d]=%s\n",0,2,szData[0][2]);//Printing string from specific location
return 0;
}
Expected structure:
+----------+----------+----------+----------+
| 0 | 1 | 2 | 3 |
+----+----------+----------+----------+----------+
| 0 | string1 | string2 | string3 |string4 |
+----+----------+----------+----------+--------- +
+----------+----------+
| 0 | 1 |
+----+----------+----------+
| 0 | string1 | string2 |
+----+----------+----------+
+----------+
| 0 |
+----+----------+
| 1 | string1 |
+----+----------+
+----------+----------+----------+----------+
| 0 | 1 | 2 | 3 |
+----+----------+----------+----------+----------+
| 2 | string1 | string2 | string3 |string4 |
+----+----------+----------+----------+--------- +
+----------+----------+
| 0 | 1 |
+----+----------+----------+
| 2 | string1 | string2 |
+----+----------+----------+
+----------+----------+----------+----------+
| 0 | 1 | 2 | 3 |
+----+----------+----------+----------+----------+
| 2 | string1 | string2 | string3 |string4 |
+----+----------+----------+----------+--------- +
+----------+----------+
| 0 | 1 |
+----+----------+----------+
| 2 | string1 | string2 |
+----+----------+----------+
下面的代码工作正常。为什么不是上面的?
#include <stdio,h>
#include <stdlib.h>
#include <string.h>
int main()
{
char***szData;
char temp[25];
szData= (char *** )malloc(4 * sizeof(char ** )) ;
szData[0]=(char**)malloc(2*sizeof(char));
szData[0][0]=(char*)malloc(25*sizeof(char));
szData[0][0]="Henry\0";
szData[0][1]=(char*)malloc(25*sizeof(char));
szData[0][1]="Korir\0";
szData[1]=(char**)malloc(sizeof(char));
szData[1][0]=(char*)malloc(25*sizeof(char));
szData[1][0]="BSc.\0";
szData[2]=(char**)malloc(3*sizeof(char));
szData[2][0]=(char*)malloc(25*sizeof(char));
szData[2][0]="Software Engineering\0";
szData[2][1]=(char*)malloc(25*sizeof(char));
szData[2][1]="Kenyatta\0 ";
szData[2][2]=(char*)malloc(25*sizeof(char));
szData[2][2]="University\0";
szData[3]=(char**)malloc(sizeof(char));
szData[3][0]=(char*)malloc(25*sizeof(char));
szData[3][0]="From Kipsaiya, Kenya\0";
printf("szData[%d][%d]=%c size=%d\n",0,1,szData[2][0][0],sizeof(szData[0][1]));
strcpy(temp,szData[2][0]);
putchar(szData[0][0][0]);
printf("temp=%s size=%d\n",temp,sizeof(szData[2][0]));
return 0;
}
最佳答案
这些分配是错误的
szData=(char***)malloc(n*sizeof(char));
^^^^^
szData[i]=(char**)malloc(m*sizeof(char));
^^^^^
应该有
szData=(char***)malloc(n*sizeof(char **));
^^^^^^^
szData[i]=(char**)malloc(m*sizeof(char *));
^^^^^^^
而不是赋值
szData[i][j]=temp;
这会导致内存泄漏,您必须使用标准函数 strcpy
strcpy( szData[i][j], temp );
此外,由于每行中的列数不同,因此您应该以某种方式保留有关一行中列数的信息。
一种方法是再分配一列并将最后一列设置为NULL
。
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( void )
{
char ***szData;
unsigned int n, m;
unsigned int i, j;
printf( "Rows: " );
scanf( "%u", &n );
szData = ( char*** )malloc( n * sizeof( char ** ) );
for ( i = 0; i < n; i++ )
{
printf( "Col: " );
scanf( "%u", &m );
szData[i] = ( char ** )calloc( ( m + 1 ), sizeof( char * ) );
for ( j = 0; j < m; j++ )
{
char temp[25];
printf( "string[%u][%u] = ", i, j );
scanf( "%24s", temp );
szData[i][j] = ( char * )malloc( strlen( temp ) + 1 );
strcpy( szData[i][j], temp );
}
}
printf( "\n" );
for ( i = 0; i < n; i++ )
{
for ( j = 0; szData[i][j] != NULL; j++ ) printf( "%10s", szData[i][j] );
printf( "\n" );
}
for ( i = 0; i < n; i++ )
{
for ( j = 0; szData[i][j] != NULL; j++ ) free( szData[i][j] );;
free( szData[i] );
}
free( szData );
return 0;
}
它的输出可能看起来像
Rows: 7
Col: 4
string[0][0] = string1
string[0][1] = string2
string[0][2] = string3
string[0][3] = string4
Col: 2
string[1][0] = string1
string[1][1] = string2
Col: 1
string[2][0] = string1
Col: 4
string[3][0] = string1
string[3][1] = string2
string[3][2] = string3
string[3][3] = string4
Col: 2
string[4][0] = string1
string[4][1] = string2
Col: 4
string[5][0] = string1
string[5][1] = string2
string[5][2] = string3
string[5][3] = string4
Col: 2
string[6][0] = string1
string[6][1] = string2
string1 string2 string3 string4
string1 string2
string1
string1 string2 string3 string4
string1 string2
string1 string2 string3 string4
string1 string2
编辑:在你更新了你的问题之后,代码是这样的
szData[0][0]=(char*)malloc(25*sizeof(char));
szData[0][0]="Henry\0";
也是错误的。
至少存在内存泄漏,因为起初 szData[0][0]
被分配了已分配内存的地址,然后在下一条语句中它被重新分配。
也不需要像 "Henry\0"
这样的字符串文字,因为字符串文字 "Henry"
已经有终止零。
关于c - C 中的动态 3D 可变列字符数组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680416/