为什么这会导致“结构”错误?

时间:2019-02-22 14:12:42

标签: c

我现在正在学习C语言,但我不知道为什么会发生错误。有人可以帮忙吗?

#include <stdio.h>
#include <stdlib.h>

int main() {

struct TestData {
int * a;
};

struct TestData * p1 = (struct TestData *)malloc(sizeof(struct TestData));

void Data(struct TestData * addstruct) {
    int b;
    addstruct->a = &b;
}//Here are two errors, error code:C2601, E0065

Data(p1);
printf("%p", p1);
free(p1);
return 0;
}

2 个答案:

答案 0 :(得分:3)

在标准C中没有本地功能。您需要将Data函数移出main

您可能想要这样:

#include <stdio.h>
#include <stdlib.h>

struct TestData {
  int * a;
};

void Data(struct TestData * addstruct) {
  int b;
  addstruct->a = &b;
}

int main() {
  struct TestData * p1 = (struct TestData *)malloc(sizeof(struct TestData));

  Data(p1);
  printf("%p", (void*)p1);  // %p needs casting to (void*)
  free(p1);
  return 0;
}

此代码可以正确编译,但是还有另一个问题:

void Data(struct TestData * addstruct) {
  int b;
  addstruct->a = &b;
}

您将指向 local 变量b的指针放入addstruct->a中,但是一旦Data完成,b就不再存在,addstruct->a因此指向垃圾。

还请阅读以下SO文章:

答案 1 :(得分:0)

在标准C yon中,无法在其他函数内部创建函数。您需要将Data函数移出main函数。

看起来像这样,还添加了一些C样式:

#include <stdio.h>
#include <stdlib.h>

struct _TestData {
  int * a;
};

typedef struct _TestData TestData;

void Data(TestData* addstruct);

int main() {
 TestData* p1 = (TestData*)malloc(sizeof(TestData));
 int test_b = 100;
 Data(p1,test_b);
 printf("%p", (void*)p1);  // %p needs casting to (void*)
 free(p1);

 return 0;
}
/* You try put local pointer , after this function it will point to junk*/
/* I have changed Data function , add one arg now, it will work */
void Data(TestData* addstruct,int* test_b) {
  addstruct->a = test_b;
  return;
}