【问题标题】:Assigning values to members of structures为结构的成员赋值
【发布时间】:2013-10-08 18:56:02
【问题描述】:

我目前正在为 C 编程课程做一个项目,但遇到了问题。我对 C 语言还是很陌生,但有 Java 编程经验。

当我尝试为 structchar * 变量成员赋值时,我的程序遇到了问题。有问题的代码如下:

void ReadFile(ComponentType * Data, int * numEl, int * numNodes)
{
  size_t index;
  FILE * dataFile;
  char * data;
  float * value;

  numEl = malloc(sizeof(int *));
  numNodes = malloc(sizeof(int*));
  Data = malloc(6 * sizeof(ComponentType));

  * numEl = 0;
  * numNodes = 0;
  index  = 0;   

  if((dataFile = fopen("mydata.dat", "r")) == NULL)
      puts("Error - file \"mydata.dat\" could not be opened!");
  else
  { 

      while(!feof(dataFile)) 
      { 

          fscanf(dataFile, "%s", data);
          Data[index].name = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].name, data);

          fscanf(dataFile, "%s", data);
          Data[index].node1 = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].node1, data);

          fscanf(dataFile, "%s", data);
          Data[index].node2 = (char *)malloc(strlen(data)+1);
          strcpy(Data[index].node2, data);

          fscanf(dataFile, "%f", value);
          Data[index].value = * value;


          int i = char2int(CircuitData[index].node1);
          if(i > * numNodes)
              * numNodes = i;

          i = char2int(CircuitData[index].node2);
          if(i > * numNodes)
              * numNodes = i;

          (* numEl)++;
          (* numNodes)++;
          index++;
      }

      fclose(dataFile);
  }

  free(Data);
  free(numEl);
  free(numNodes);       
}

结构定义如下:

typedef struct
{
  char * name;
  char * node1;
  char * node2;
  float value;
} ComponentType;

我已经对程序进行了调试,基本上发生的是文件被正确读取并且存储在 data 中的值是正确的,但是打印出 Data[index].name 在格式化为 char * 时会导致分段错误,或者在调试程序中打印出 0x0。简而言之,从文件中读取的值不会被复制到我想要它们的结构变量中。

任何建议/帮助将不胜感激。 谢谢。

编辑:我正在使用 Linux 64 位编码

编辑 2:我添加了发生错误的整个函数,并进行了以下建议的更改

【问题讨论】:

  • 要正确回答这个问题,我们需要知道data是如何定义的,Data.name是如何定义的。
  • 实际上,char * data = malloc(sizeof(char *)); 是不需要的。只需对char * data; 执行同样的操作float 等。;)
  • 感谢@JoeDF。我改了

标签: c structure


【解决方案1】:

首先:调试程序时,检查sizeof(data) 是什么。
您会惊讶地发现它是 8(指针的大小),而不是 6(您分配的大小)
这是因为sizeof 测量类型的大小,而datachar*,(也称为指针)。

指针是 8 字节。 (在 64 位系统上。其他系统不同)
这会导致您为 Data[index].name 分配 8 个字节。

下一步:您无法使用 = 运算符将数据从一个数组复制到另一个数组,就像您尝试使用的那样:

Data[index].name = data;

正确地做到这一点

fscanf(dataFile, "%s", data);
// Measure the length of data, and allocate enough space (including the null-termiantor)
Data[index].name = malloc(strlen(data) + 1);  

// Copy from data into Data[index].name.   For greater safety, look into strcpy_s
strcpy(Data[index].name, data);

【讨论】:

  • 好的,所以我检查了。 char * 对于我的程序来说是 8_bytes,而 strlen(data)+1 是 3-bytes。我知道 strcpy 现在是正确的方法,但是 Data[index].name_ 仍然返回 0x0
  • 这取决于数据是如何定义的。如果是 char *,是的。如果它是一个数组,sizeof 将返回数组的大小。此外,strdup 可能是将数据复制到 Data[index].name 的更好方法
  • 要正确回答问题,您需要知道数据是如何定义的,以及Data.name是如何定义的。
猜你喜欢
  • 2015-12-20
  • 2021-05-19
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多