Почему это вызывает ошибку для «struct»? - PullRequest
0 голосов
/ 22 февраля 2019

Я сейчас изучаю язык Си и не знаю, почему произошла ошибка.Может кто-нибудь помочь?

#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 голосов
/ 22 февраля 2019

В стандартном C не может создавать функции внутри других функций.Вам нужно переместить функцию 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;
}
0 голосов
/ 22 февраля 2019

В стандарте 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;
}

Вы помещаете указатель на локальную переменную b в addstruct->a, но как только Data заканчивается, b больше не существует и, следовательно, addstruct->a указываетв мусор.

Читайте также следующие статьи SO:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...