【发布时间】:2021-04-21 09:47:10
【问题描述】:
这是为 2 个未知大小的数组分配内存的代码。 N 由用户给出:
K=malloc(N*sizeof(int));
if(K==NULL){
// printf("Sorry, cannot allocate memory\n");
return -1;
}
for(i = 0;i < N;i++){
C = malloc(N * sizeof(int *));
if (C == NULL){
return -1;
}
for (i = 0 ; i < N ; i++) {
*(C+i) = malloc(K[i] * sizeof(int));
if (*(C+i) == NULL){
return -1; }
}
}
两个数组都填充了用户给出的数字。 并释放他们:
for (i=0 ; i < N ; i++){
for (i=0 ; i < N ; i++){
free(*(C+i));
}
free(C);
}
void free(void*K);
通过 gbd 调试我遇到了这个错误
程序收到信号SIGSEGV,分段错误。 _int_free (av=0x10102464c457f, p=0x8005770, have_lock=) at malloc.c:4304 4304 malloc.c: 没有这样的文件或目录。
通过使用 valgrind 更深入地研究这个错误,我似乎没有泄漏。可能是什么问题?
【问题讨论】:
-
请记住,对于任何指针或数组
p和索引i,表达式*(p + i)完全等于p[i]。这意味着当您使用*(C+i)时,它与C[i]相同。后者更易读,写更短。 -
与您的问题更相关,当您在循环中执行
C = malloc(N * sizeof(int *));时,您将有大量内存泄漏。只有来自 last 迭代的分配可从指针C获得。另请注意,您永远不会在任何地方初始化K[i],它将有一个 indeterminate(并且看似随机/垃圾)值。 -
void free(void*K);什么都不做。它只是free的原型声明,您可能已经通过包含<stdlib.h>得到了它。只需拨打free(K); -
@Someprogrammerdude 数组 K 和 C 的内容充满了用户提供的信息。我对其进行了编辑,使其更有意义
标签: c segmentation-fault malloc free