Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:没有这样的文件或目录_C_Malloc_Runtime Error - Fatal编程技术网

c:没有这样的文件或目录

c:没有这样的文件或目录,c,malloc,runtime-error,C,Malloc,Runtime Error,我正试图用C语言编写一个程序,它接受一个输入流,并根据字符串中出现的空格来中断输入,然后从中创建一个二维数组。e、 g 如果输入为: 这是cat 输出: 此 是 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;

我正试图用C语言编写一个程序,它接受一个输入流,并根据字符串中出现的空格来中断输入,然后从中创建一个二维数组。e、 g

如果输入为:

这是cat

输出:



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 == '\0' || c == '\r'){
            flag = 1;
            break;
        }
        else{
            element[element_count] = (char)c;
            element_count++;
        }
    }
    element[element_count] = '\0';
    *a[i] = element;
    if(flag == 1)break;
}
for( i = 0; i < size; i++){
    printf("%s\n", *a[i]);
}
return 0;
}
#包括
#包括
#包括
int main(){
国际**a;
int*元素;
int i;
int size=2;
int元素_size=2;
int元素_计数=0;
字符c;
int标志=0;
if((a=(int**)calloc(size,sizeof(int**))==NULL){
printf(“空间不足”);
出口(0);
}
对于(i=0;i=size){
尺寸*=2;
if((a=(int**)realloc(size,sizeof(int**))==NULL){
printf(“空间不足”);
出口(0);
}
}
if((element=(int*)calloc(element_size,sizeof(int*)))==NULL){
printf(“空间不足”);
出口(0);
}
而(1){
c=getchar();
如果(元素计数>=元素大小){
元素大小*=2;
if((element=(int*)realloc(element_size,sizeof(int*)))==NULL);
}
如果(c=''){
flag=0;
打破
}
else如果(c='\n'| | c='\0'| | c='\r'){
flag=1;
打破
}
否则{
元素[元素计数]=(字符)c;
元素_计数++;
}
}
元素[元素计数]='\0';
*a[i]=元素;
如果(标志==1)中断;
}
对于(i=0;i
此代码使用coredump给出运行时错误
SIGSEV

使用gdb对堆芯倾倒进行的分析表明:

程序以信号SIGSEGV终止,分段故障#malloc.c:2977处的0 _; GI _; libc realloc(oldmem=0x4,字节=8)
2977 malloc.c:没有这样的文件或目录。

这个错误意味着什么

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

for(i = 0; i <= size; i++)
应该是

for(i = 0; i < size; i++)
a = calloc(size, sizeof(int *))) 

使用
i有两个调用
realloc
,它们都是错误的。realloc
的第一个参数是指向要重新分配的内存区域的指针,第二个参数是以字节为单位的大小

这与
calloc
的参数完全不同。请注意,
realloc
不会清除新内存。如果需要清除额外分配的内存,则应自行清除。如果没有,可能是
calloc
可以被
malloc
替换,但这取决于您

我想你的编译器已经警告过你了。编译时,您应该看到这样的警告:(当然,使用不同的文件名)

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

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

所以我建议:

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这样的头文件。如果您删除了标题声明,您应该会过得更好


H@ppy
a=(int**)calloc(size,sizeof(int**))==NULL应该是
a=calloc(size,sizeof(int*))==NULL
@Gopi你能给出理由吗?你所有的
alloc
都错了。如果要分配一个X数组,则将
…alloc
的结果分配给*X类型的变量,但在分配中使用sizeof(X)——而不是sizeof(*X)。同样,**X=…alloc(…sizeof(*X))。编译器不会抱怨malloc.h丢失。调试器抱怨malloc.c丢失;结果是调试器无法显示发生错误的行的源代码。顺便说一下,glibc包含一个malloc.h头,如果需要设置malloc选项,可以使用它。(参见
manmallopt
)在这种情况下,当然没有必要。这就是我所指出的。他说要提及任何他“做错”的事情,但还没有人指出这一点。想想看,没有人指出你在这里提到的问题是的。。主要问题是
realloc
calloc
以及
第58行和
第54行的参数。已获得输出。@princethewinner:我修复了答案中的复制粘贴错误。(并添加了关于内存泄漏和realloc的常见警告。)如果有混淆,请道歉。
if((a = realloc(a, size * sizeof *a))) == NULL)
{ void* tmp = realloc(a, size * sizeof *a);
  if (tmp) { a = tmp; }
  else {
    free(a); /* Avoid the memory leak */
    /* Handle the error */
  }
}