ошибка сегментации во время выполнения - PullRequest
0 голосов
/ 16 апреля 2011
#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 ]

3 голосов
/ 16 апреля 2011

Измените эту строку

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 голос
/ 16 апреля 2011

В

char *arg[10];

вы определяете массив из 10 указателей на символ , но не инициализируете его элементы .arg [0], arg [1], ..., arg [9] будут иметь неопределенные значения.

Затем вы попытаетесь ввести строку в одно из этих неопределенных значений.К счастью, у вас ошибка сегментации.Если бы вам не повезло, ваша программа могла бы отформатировать ваш жесткий диск .

1 голос
/ 16 апреля 2011
char *arg[10] ;

arg - массив указателей на символы. Вам нужно назначить им ячейки памяти, используя 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.

A нормальная переменная история совершенно другая. Когда объявлено -

int var ;

Памяти выделено var для хранения целого числа. Таким образом, вы можете напрямую назначить ему целое число.

0 голосов
/ 19 октября 2012
#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;  
}  
...