переменная стека c повреждена - PullRequest
0 голосов
/ 28 мая 2011

Я прочитал все вопросы по этому типу проблемы, но не могу исправить свой. Проблема в том, что я использую функцию для чтения данных из файла, и я получаю эту ошибку: «Стек вокруг переменной« p »поврежден» Это функция

Firm readFirm(char* name)
{
FILE* file = NULL;
int i = 0;
Firm firm;
char line[100];
char* p[5] = {(char*)malloc(50)};

char tmp[50];
strcpy(tmp,name);
strcat(tmp,".txt");
file = fopen(tmp,"rb");

getline(file,line,100);
strcpy(firm.name,line);
getline(file,line,100);
strcpy(firm.EIK,line);
getline(file,line,100);
split(p,line," ");
for (i = 0 ; p[i] != NULL; i++)
    firm.price[i] = atoi(p[i]);
getline(file,line,100);

split(p,line,".");
firm.day = atoi(p[0]);
firm.month = atoi(p[1]);
firm.year = atoi(p[2]);
fclose(file);
return firm;

}

Пожалуйста, помогите, потому что я не знаю, как это исправить!

Это функция разделения:

char ** split( char *result[], char *w, const char *delim)
{
int i=0;
char *p=NULL;
for(i=0, result[0]=NULL, p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim), i++ )
{
       result[i]=p;
       result[i+1]=NULL;
}
return result;
}

Ответы [ 2 ]

5 голосов
/ 28 мая 2011

В декларации char* p[5] = {(char*)malloc(50)}; есть проблемы.Это приводит к тому, что p[1], p[2], p[3] и p[4] инициализируются мусором, скорее всего, немногие из них будут NULL, что и проверяет цикл.

Есть такжепроблемы с использованием getline(), в особенности из-за того, что параметры находятся в неправильном порядке и не имеют достаточной косвенности.

1 голос
/ 28 мая 2011

изменить строку:

char* p[5] = {(char*)malloc(50)};

до

char *p[5];
int i=0, n=5;

/* Allocate */ 
for (i=0; i<n; i++)
{
  p[i] = malloc (sizeof (char) * 50);
}

/* Do work */

/* Deallocate */

for (i=0; i<n; i++)
{
  free (p[i]);
}

EDIT1:

похоже, что вы хотели добиться назначения по умолчанию остальных мест, как мы можем сделать с

char arr[10] = {0};

Но в вашем случае у вас есть

char *p[5];

и для каждого местоположения p вам нужна отдельная ячейка памяти, которая должна быть индивидуально назначена / выделена и освобождена / освобождена от вышеуказанного.

EDIT2:

В вашей функции разделения вы делаете ужасные вещи. Если вы выделили память для p в основном, а затем передали ее в функцию split, то почему вы назначаете указатель снова на элементы массива p. Каждый элемент p указывает на весь массив (блок памяти), который можно использовать для хранения строки. Таким образом, вы должны скопировать часть строки в p[i] для некоторого индекса i, с strcpy.

Кроме того, почему вы возвращаете массив? Вы передали его в качестве указателя, и все изменения, внесенные в него в функции, сохранятся после возврата.

EDIT3:

Вот модифицированное разбиение, выполненное с применением минимальных модификаций к вашему коду.

void split( char *result[], char *w, const char *delim)
{
    int i=0;
    char *p;

    for(i=0, p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim), i++ )
    {
       strcpy (result[i], p);
    }
}

Вот основная функция теста:

int main (void)
{

  char arr[128] = "10.08.1989";
  char *p[5];
  int i, n = 5;

  for (i=0; i<n; i++)
  {
    p[i] = malloc (sizeof (char) * 50);
  }

  split (p, arr, ".");

  printf ("%s\n", p[0]);
  printf ("%s\n", p[1]);
  printf ("%s\n", p[2]);


  for (i=0; i<n; i++)
  {
    free (p[i]);
  }
  printf ("\n");
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...