提问人:at_Root 提问时间:10/12/2022 最后编辑:at_Root 更新时间:10/12/2022 访问量:68
无法访问 malloc 生成的 2D 数组中的某些元素
can't access some elements in malloc generated 2D array
问:
我正在尝试用 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)
在那一刻,我尝试了所有会做的事情,所以不知何故,我发现第三根弦是问题所在。
所以如果我删除这条线,一切都很好!noob
test3
table[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];
答:
2赞
Vlad from Moscow
10/12/2022
#1
你声明的指针是这样的table
char*** table;
所以这个语句中使用的表达式table[0]
table[0] = malloc(sizeof(char) * 20);
具有类型,并且您为字符分配了内存。char **
20
如果等于,则分配的内存只能容纳 类型的两个指针。如果等于,则分配的内存只能容纳 类型的指针。sizeof( char * )
8
char *
sizeof( char * )
4
5
char *
您需要执行如下操作
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 同样,新代码具有未定义的行为。未定义的行为意味着任何事情都可能发生。
评论
char*** table;
malloc(sizeof(char) * 20)
char
char array[20]
char *
char **
2d_arr=[["test"], ["test1","test2"]]