Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将值指定给结构的成员_C_Structure - Fatal编程技术网

C 将值指定给结构的成员

C 将值指定给结构的成员,c,structure,C,Structure,我目前正在做一个C编程课程的项目,遇到了一个问题。我对C语言还是相当陌生,但有编写Java的经验 我的程序在尝试将值分配给结构的变量成员时遇到问题。有关守则如下: void ReadFile(ComponentType * Data, int * numEl, int * numNodes) { size_t index; FILE * dataFile; char * data; float * value; numEl = malloc(sizeof(int *));

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

我的程序在尝试将值分配给结构的变量成员时遇到问题。有关守则如下:

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;
我已经在程序上运行了调试,基本上发生的是正确读取文件,并且存储在数据中的值是正确的,但是打印出数据[index]。name在格式化为字符*时会导致分段错误,或者在调试程序中打印出0x0。简而言之,从文件中读取的值不会被复制到我想要的结构变量中

如有任何建议/帮助,将不胜感激。 多谢各位

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


编辑2:我添加了发生错误的整个函数,首先修改了以下建议:调试程序时,请检查(数据)大小。
您会惊讶地发现它是8(指针的大小),而不是6(您分配的大小)
这是因为
sizeof
测量类型的大小,
data
是一个
char*
,(又称指针)。指针是8字节。(在64位系统上。其他系统不同)
这将导致为
数据[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);

首先:调试程序时,检查
大小(数据)
是多少。
您会惊讶地发现它是8(指针的大小),而不是6(您分配的大小)
这是因为
sizeof
测量类型的大小,
data
是一个
char*
,(又称指针)。指针是8字节。(在64位系统上。其他系统不同)
这将导致为
数据[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字节,strlen(data)+1是3字节。我知道strcpy现在是正确的方法,但是Data[index].name仍然返回0x0,这取决于数据是如何定义的。如果是char*,是的。如果是数组,sizeof将返回数组的大小。另外,strdup可能是将数据复制到数据[index].name的更好方法。要正确回答这个问题,您需要知道数据是如何定义的,以及data.name是如何定义的。好的,我检查了。对于我的程序,char*是8字节,strlen(data)+1是3字节。我知道strcpy现在是正确的方法,但是Data[index].name仍然返回0x0,这取决于数据是如何定义的。如果是char*,是的。如果是数组,sizeof将返回数组的大小。另外,strdup可能是将数据复制到数据[index]的更好方法。name要正确回答这个问题,您需要知道如何定义数据以及如何定义data.name。要正确回答这个问题,我们需要知道如何定义数据以及如何定义data.name。实际上,
char*data=malloc(sizeof(char*)是不需要的。只需做
char*数据浮动的情况也一样。
float
etc;)谢谢@JoeDF。为了正确回答这个问题,我们需要知道数据是如何定义的,data.name是如何定义的。实际上,
char*data=malloc(sizeof(char*))是不需要的。只需做
char*数据浮动的情况也一样。
float
etc;)谢谢@JoeDF。我改了