c - C 中的动态 3D 可变列字符数组操作

标签 c arrays string pointers malloc

我想要以下代码来生成类似于代码下方的结构。我没有从代码中得到它。

我希望代码创建一个 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/

相关文章:

c - c中的不可变字符串的内存分配在哪里?

java - 字符串数组在android中只返回一个字符串

c - C 中的反向函数产生单词然后产生垃圾

javascript - 如何取出双数组中的对象

arrays - 设计指标的建议

python - 在 Python 中使用 csv 文件使用字典计算字符串中的单词数

c - (初级程序员)需要帮助 : Linked Lists in C

python - python 的 ctypes 和 swig 之间的互操作性

c - 指向 3d 数组的指针

javascript - 如何循环遍历对象数组以查找包含相同单词的键值-Javascript