coredump при печати строки символов - PullRequest
0 голосов
/ 04 июня 2019

У меня есть 3 вопроса:

  1. Почему userHostPairs[count]=line дает нежелательный результат, как объяснено в комментарии в коде?
  2. Почему произойдет сбой программы при печати?
  3. Как передать userHostPairs в качестве аргумента в readEnv (), чтобы его можно было использовать в main?
     #define MAX_HOSTS 100
     #define MAX_LINE_SIZE 100

     void readEnvList()
     {
            FILE *fp;

            char  line[MAX_LINE_SIZE];
            char* userHostPairs[MAX_HOSTS];

            if((fp = fopen("somefile", "r")) == NULL)
            {
                //ERR_StdReportAndReturn_2(OPIGN_FILE_FAILURE ,"write", schScriptFileName);
                printf("Failed to open the file\n");
            }

            int count =0;
            while (fgets(line, sizeof(line), fp) != NULL ) {
                    //userHostPairs[count]=line;  --Assignment like this gives undefined results. e.g. at the end of the loop userHostPairs[0] & userHostPairs[1] both contain the last fetched line from file.
                    strcpy(userHostPairs[count],line);
                    count++;
            }

            printf("%s",userHostPairs[0]); //CORE DUMP here

    }
    int main()
    {
            readEnvList();
    }

1 Ответ

2 голосов
/ 04 июня 2019

В вашем коде

  strcpy(userHostPairs[count],line);

вы пытаетесь записать в унифицированный указатель (и) (userHostPairs[count]), который указывает на неопределенный адрес.Таким образом, ячейка памяти недействительна в контексте вашей программы, и попытка записи в недействительную ячейку памяти вызывает неопределенное поведение .

Вам необходимо либо

  • Назначьте допустимые ячейки памяти для каждого из userHostPairs[count], чтобы каждый элемент указывал на действительный блок памяти (пример: использование malloc() или семейство), а затем используйте strcpy() в качествеВы сделали.
  • Используйте strdup(), чтобы завершить копирование.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...