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