c堆栈变量​​已损坏

时间:2011-05-28 16:45:35

标签: c stack

我已经阅读了所有关于此类问题的问题,但我无法修复我的问题。 问题是我使用一个函数从文件中读取数据,我得到这个错误: “堆栈变量'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 个答案:

答案 0 :(得分:5)

声明char* p[5] = {(char*)malloc(50)};存在问题。它会导致p[1]p[2]p[3]p[4]被初始化为垃圾,最有可能的是,没有多少是NULL,这就是循环测试的内容。< / p>

使用getline()时也存在问题,最值得注意的是参数的顺序错误且没有足够的间接性。

答案 1 :(得分:1)

更改行:

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:

在你的分裂功能中,你做的很糟糕。如果您已在main中为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;
}