执行期间的分段错误

时间:2011-04-16 14:23:38

标签: c ansi

#include<stdio.h>   
int main()  
{    
    char *arg[10],*c;  
    int count=0;  
    FILE *fp,*fq;  
    printf("Name of the file:");  
    scanf("%s",arg[1]);  
    fp=fopen(arg[1],"w");  
    printf("\t\t%s",arg[1]);  
    printf("Input the text into the file\n");  
    printf("Press Ctrl+d to the stop\n");  
    while((*c=getchar())!=EOF)  
    {  
            fwrite(c,sizeof(char),1,fp);  
            count++;  
    }  
    return 0;  
}  

4 个答案:

答案 0 :(得分:3)

更改此行

char *arg[10],*c;

char arg[1000],c;

这一行

scanf("%s",arg[1]);  

scanf("%s",arg);  

这一行

while((*c=getchar())!=EOF)

while((c=getchar())!=EOF)

说明:

char *c;不是角色。它是角色的指针。它开始只是指向一个随机的内存位,通常会填充随机数据 - 无论最近写的是什么。

char c; 一个角色。

同样的事情适用于char *arg[10]。这是十个指针的数组。它们指向随机存储器,充满了随机数据。

注意:我的更改是不是最佳做法。如果有人要输入长度为1000个字符或更长的文件名,则需要在arg缓冲区的末尾写入。根据您正在做的事情,这可能是一个安全漏洞。

答案 1 :(得分:1)

char *arg[10] ;

arg是一个char指针数组。在进行输入之前,您需要使用malloc为它们分配内存位置 -

scanf("%s",arg[1]); // arg[1] is not assigned to point to any memory location
                    // and is what causing the segmentation fault.

所以 -

arg[1] = malloc( stringLengthExpectedToEnter + 1 ) ; // +1 for termination character

对于其他数组元素也应如此(或)只需将char*arg[10]更改为char arg[10],并确保只输入9个字符。


我认为您在指针正常变量之间感到困惑。

int *ptr;

ptr是可以保存整数变量地址的变量。内存分配给ptr变量以保存整数地址。而已。 ptr处于未初始化状态,并且不指向(或)可能指向垃圾的位置。取消引用未初始化指针的行为是未定义的,如果它提供分段错误,您很幸运。

现在,您需要使用malloc为其分配有效的内存位置。

ptr = malloc( sizeof(int) ) ; // Allocates number of bytes required to hold an
                              // integer and returns it's address.

因此,ptr现在指向从可以容纳整数的免费商店获取的内存位置。必须使用free释放从免费存储中获取的此类位置,否则您会遇到内存泄漏的经典问题。最好在声明时初始化指向 NULL 的指针。

int *ptr = NULL ;

希望它有所帮助!

scanf("%d", ptr) ; // Notice that & is not required before ptr. Because ptr 
                   // content is address itself.

正常变量故事完全不同。声明时 -

int var ;

将内存分配给var以保存整数。因此,您可以直接为其分配一个整数。

答案 2 :(得分:1)

char *arg[10];

你定义了一个包含10个指向char 的指针的数组,但你没有初始化它的元素。 arg [0],arg [1],...,arg [9]都会有未定义的值。

然后,您尝试将字符串输入其中一个未定义的值。幸运的是,你有一个分段错误。如果你运气不好,你的计划could format your hard disk会改为。

答案 3 :(得分:0)

#include<stdio.h>   
int main()  
{    
   char arg[10],c;  
   int count=0;  
   FILE *fp;  
   printf("Name of the file:");  
   scanf("%s",arg);  
   fp=fopen(arg,"w");  
   printf("\t\t%s",arg);  
   printf("Input the text into the file\n");  
   printf("Press Ctrl+d to the stop\n");  
   while((c=getchar())!=EOF)  
   {  
        fwrite(&c,sizeof(char),1,fp);  
        count++;  
   }

   if(fp != NULL){
      fclose(fp);
      fp = NULL;
   }
   return 0;  
}