【发布时间】:2019-03-06 18:37:22
【问题描述】:
我的问题很简单,我想为 c 中的二维数组分配内存,用 -1 填充它,然后释放它并退出程序。我的代码不断崩溃,我不知道我做错了什么...... 这就是我得到的:
int main(){
int i,j;
char str1[]="xxxabxcxxxaabbcc";
char str2[]="abc";
int len1=strlen(str1);
int len2=strlen(str2);
printf("%d %d",len1,len2);
//allocate 2d_array
int **H_table = (int**)malloc((len1+1)*sizeof(int));
for (i=0; i<len1+1; i++){
H_table[i] = (int*)malloc((len2+1)*sizeof(int));
}
//fill and print 2d array
for(i=0;i<len1+1;i++){
for(j=0;j<len2+1;j++){
printf("i:%d j:%d",i,j);
H_table[i][j]=-1;
printf(" value:%d\n",H_table[i][j]);
}
}
// free 2d array
for(i=0;i<len1;i++){
free(H_table[i]);
}
free(H_table);
return 0;
}
所以发生的情况是,如果你将它们垂直放置,我想分配一个比 2 个字符串多 1 行和 1 列的数组。
这是我所期望的(括号中的东西显然不是表格的一部分,我把它放在那里进行比较):
(x x x a b x c x x x a a b b c c)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
a)1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
b)1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
c)1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
问题是代码在填满表格时会崩溃,对于那些特定的字符串,它总是在 i=9 和 j=3 时崩溃。奇怪的是,如果您交换 2 个字符串(在 str1 中放入“abc”),则代码会通过填充阶段,并在尝试释放数组时崩溃。
对于任何语法错误或stackoverflow错误,我很抱歉:P
欢迎任何想法 :) 提前谢谢
【问题讨论】:
-
这里有一个提示:写 malloc 的最佳方式是:
SomeType* some_variable = malloc(n * sizeof *some_variable);。例如:int** H_table = malloc((len1+1) * sizeof *H_table);或H_table[i] = malloc((len2 + 1) * sizeof * H_table[i]);。在 C 语言中,没有必要明确区分 malloc 的返回值。使用sizeof *variable而不是sizeof(whatever you think the type should be)可以让您不必考虑类型应该是什么:-) 如果您以后将变量的类型从int*更改为@,则不必更改987654329@ -
@rici 和 Mike Hatzak,这些错误是一种拼写错误,这个问题对其他人有用并且需要保留,还是删除它更好?
-
@rici 如果你想我删除我的答案,你把你的 ? ^^ 当我回答时,我看到 xing 平行地做了他的第一句话
-
@rici 好的,我删除它
-
非常感谢大家的回答,看起来这个问题确实是一个错字,但是 xing 建议的事情确实使它工作(int->int*)。所以是的,正如 rici 所说,我将代码中的所有内容都更改为他所说的内容,只是为了确定。如果你想删除我不介意的线程,但它可以节省人们一些时间和挫败感,因为这些错误会让没有经验的人撞到墙上:P 再次感谢