malloc.c: 没有那个文件或目录

malloc.c: No such file or directory

我正在尝试用 C 语言编写一个程序,它接受输入流并根据字符串中空格的出现打破输入,并从中创建一个二维数组。例如

如果输入是:

this is cat

输出:

this
is
cat

我的代码如下:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main(){
int ** a;
int * element;
int i;
int size = 2;
int element_size = 2;
int element_count = 0;
char c;
int flag = 0;

if((a = (int **)calloc(size, sizeof(int **))) == NULL){
    printf("Not enough space");
    exit(0);
}
for(i = 0; i <= size; i++){
    element_size = 2;
    element_count = 0;
    flag = 0;
    if(i >= size){
        size *= 2;
        if((a = (int **)realloc(size, sizeof(int **))) == NULL){
            printf("Not enough space");
            exit(0);
        }
    }
    if((element = (int *)calloc(element_size, sizeof(int *))) == NULL){
        printf("Not enough space");
        exit(0);
    }
    while(1){
        c = getchar();
        if(element_count >= element_size){
            element_size *= 2;
            if((element = (int *)realloc(element_size, sizeof(int *))) == NULL);
        }
        if(c == ' '){
            flag = 0;
            break;
        }
        else if(c == '\n' || c == '[=11=]' || c == '\r'){
            flag = 1;
            break;
        }
        else{
            element[element_count] = (char)c;
            element_count++;
        }
    }
    element[element_count] = '[=11=]';
    *a[i] = element;
    if(flag == 1)break;
}
for( i = 0; i < size; i++){
    printf("%s\n", *a[i]);
}
return 0;
}

此代码在使用 coredump 时出现运行时错误 SIGSEV

用 gdb 分析核心转储显示:

Program terminated with signal SIGSEGV, Segmentation fault. #0 __GI___libc_realloc (oldmem=0x4, bytes=8) at malloc.c:2977 2977 malloc.c: No such file or directory.

这个错误是什么意思?

如果有人能指出我的代码中的错误或任何新的方法,那将非常有帮助。

for(i = 0; i <= size; i++)

应该是

for(i = 0; i < size; i++)

a = (int **)calloc(size, sizeof(int **))) 

应该是

a = calloc(size, sizeof(int *))) 

使用 i<=size 您正在越界访问并且有未定义的行为。

int **a 是指向指针的整数指针,您需要为 int *

的指针分配内存

您对 realloc 进行了两次调用,但均有误。 realloc 的第一个参数是指向要重新分配的内存区域的指针,第二个参数是 字节大小 .

这与 calloc 的论点完全不同。请注意,realloc 不会清除新内存。如果您需要清除额外分配的内存,您应该自己清除它。如果不是,可能 calloc 可以替换为 malloc,但这取决于您。

我认为您的编译器警告过您这一点。当你编译时,你应该看到这样的警告:(当然是不同的文件名)

badrealloc.c: In function ‘main’:
badrealloc.c:25:9: warning: passing argument 1 of ‘realloc’ makes pointer from integer without a cast [enabled by default]
         if((a = (int **)realloc(size, sizeof(int **))) == NULL){

顺便说一句,在第 58 行触发了另一个重要警告。

在 C 中,没有必要显式转换 alloc 函数的 return,许多人(包括我)会建议您不要那样做。此外,通常最好在所需类型的值上使用 sizeof,而不是尝试自己计算类型,这很容易出错。 (例如,您对 realloccalloc 的两次调用都弄错了)。

所以我建议:

if((a = realloc(a, size * sizeof *a))) == NULL)

然而,上面的说法确实不正确,因为当realloc失败时会导致内存泄漏。你真正应该做什么:

{ void* tmp = realloc(a, size * sizeof *a);
  if (tmp) { a = tmp; }
  else {
    free(a); /* Avoid the memory leak */
    /* Handle the error */
  }
}

让我印象深刻的是 malloc 包含在 stdlib.h 中;没有 malloc.h 这样的 header。如果您删除 header 声明,您应该会过得更好。

H@ppy <0d|^g!