无法访问 malloc 生成的 2D 数组中的某些元素

can't access some elements in malloc generated 2D array

提问人:at_Root 提问时间:10/12/2022 最后编辑:at_Root 更新时间:10/12/2022 访问量:68

问:

我正在尝试用 C 语言制作一个 2D 数组,并使用 malloc 进行“哈希映射”项目,但像往常一样。出事了!

基本上我有访问第一个数组的第 3 个元素的问题,这非常奇怪(至少对我来说),所以让我向您展示代码arr[0][3]

1-创建2D数组:

int main(void){
    char*** table;
    table = malloc(sizeof(char*) * 10);
    //create array inside table
    table[0] = malloc(sizeof(char) * 20);
    
    return 0;
}

2- 将一些字符串分配给第一个数组:table[0]

    table[0][1] = "test1";
    table[0][2] = "test2";
    table[0][3] = "test3";
    table[0][4] = "test4";
    ...
    table[0][n] = "testn";

3-现在奇迹发生了:

   // 10 => n >= 0;
   printf("%s", table[0][n]);

返回 ->malloc(): corrupted top size Aborted (core dumped)

在那一刻,我尝试了所有会做的事情,所以不知何故,我发现第三根弦是问题所在。 所以如果我删除这条线,一切都很好!noobtest3table[0][3]

    table[0][1] = "test1";
    table[0][2] = "test2";
    //table[0][3] = "test3";
    table[0][4] = "test4";
    ...
    table[0][n] = "testn";
    
    // 10 => n >= 0;
    printf("%s", table[0][n]);

返回 => “testn”;

编辑工作:Vlad From Moscow

   for(int i=0; i<10; i++{
       table[0][n] = "test";
       //here works
       printf("%s", table[0][n];
   }
   //here also works fine
   printf("%s", table[0][3];
c 多维数组 malloc 动态内存分配 大小

评论

0赞 Some programmer dude 10/12/2022
如果是正确的,并且你想要一个字符串数组的数组(一个“3d”数组),那么你的分配是错误的。例如,将为 20 个字符分配足够的空间,而不是指向 .它类似于 .你对其他分配也犯了同样的问题,但它在那里起作用,因为指针就是指针,不管它是 or .char*** table;malloc(sizeof(char) * 20)charchar array[20]char *char **
0赞 at_Root 10/12/2022
@Someprogrammerdude这正是我想要的,就像在 python 中一样2d_arr=[["test"], ["test1","test2"]]

答:

2赞 Vlad from Moscow 10/12/2022 #1

你声明的指针是这样的table

char*** table;

所以这个语句中使用的表达式table[0]

table[0] = malloc(sizeof(char) * 20);

具有类型,并且您为字符分配了内存。char **20

如果等于,则分配的内存只能容纳 类型的两个指针。如果等于,则分配的内存只能容纳 类型的指针。sizeof( char * )8char *sizeof( char * )45char *

您需要执行如下操作

char*** table;
table = malloc(sizeof(char**) * 10);
//create array inside table
for ( size_t i = 0; i < 10; i++ )
{
    table[i] = malloc(sizeof(char *) * 20);
}

这些内存分配将模拟 类型的二维数组。char * table[10][20]

另一方面,您可以立即为二维数组分配内存,例如

char * ( *table )[20] = malloc( sizeof( char *[10][20] ) );

评论

0赞 at_Root 10/12/2022
是的,它奏效了,但为什么呢?为什么在我的代码中只有第三个字符串返回,这很有趣!malloc(): corrupted top size Aborted (core dumped)
0赞 Vlad from Moscow 10/12/2022
@at_Root 在哪种情况下会出现错误?在你的代码中的问题?
0赞 at_Root 10/12/2022
3当我直接或甚至将其存储在变量中时,将 printf 调用到任何分配的字符串中,然后打印它,甚至存储字符串的 len 尝试到它printf
0赞 Vlad from Moscow 10/12/2022
@at_Root 如果你指的是你的代码,那么正如我所写的那样,如果 sizeof( char * ) 等于 8,分配的内存只能容纳两个 char * 类型的指针。
1赞 Vlad from Moscow 10/12/2022
@at_Root 同样,新代码具有未定义的行为。未定义的行为意味着任何事情都可能发生。