gpt4 book ai didi

c - 在c中动态分配二维数组错误

转载 作者:行者123 更新时间:2023-11-30 14:41:21 25 4
gpt4 key购买 nike

我的问题非常简单,我想在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;
}

所以,如果将两个字符串垂直放置,我想分配一个比这两个字符串多 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 个字符串(将“abc”放入 str1),那么代码就会通过填充阶段,并在尝试释放数组时崩溃。

对于任何语法错误或 stackoverflow 错误,我深表歉意,我是个新人:P

欢迎任何想法:)提前致谢

最佳答案

正如许多人指出的那样,您为 H_table 分配了 len1 + 1 整数 的空间,但实际上应该是这样是一个由 len1 + 1 指针组成的数组(指向整数)。由于指针比整数大(无论如何,在您的系统上),因此您最终会因缓冲区溢出而出现未定义的行为。

这里有一个提示。通过始终使用以下 malloc 模型来避免此问题以及各种其他类似问题:

some_variable = malloc(n * sizeof *some_variable);

例如:

int** H_table = malloc((len1 + 1) * sizeof *H_table);
for (int i = 0; i <= len1; ++i)
H_table[i] = malloc((len2 + 1) * sizeof *H_table[i]);

也就是说,让编译器找出变量(或左值)的正确类型。编译器比您更不容易出现拼写错误,并且不显式编写类型将使您以后更容易决定 H_table 应该是 long无符号

出于同样的原因,不要显式转换 malloc 的返回值。 C 自动将 void* 转换为目标类型,并且如果您手动转换为错误的类型,则不会提供错误。所以就让编译器来做吧;打字更少、更安全、更面向 future 。

请注意,如果您使用带有 sizeof 的表达式,编译器不会计算该表达式 [注 1]。它只是找出类型并将其替换为表达式。所以不用担心额外的评估:没有任何评估。这也是为什么可以将此模型与声明一起使用,即使在执行 mallocsome_variable 还没有值。

<小时/>

注释:

  1. 在一种情况下,编译器可能会在 sizeof ex 中计算 ex:如果 ex 是一个可变长度数组。但是,在这种情况下 ex 始终是一个指针,因此这种情况不适用。

关于c - 在c中动态分配二维数组错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55030044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com