C++에서 프로젝트를 C로 변환하고 시작하기 위해 많은 C++ 기능을 사용하지 않았기 때문에 자연스럽게 진행되었습니다. 그러나 나는 작은 테스트 프로그램에서 복제 할 수 있었던 특이한 문제를 발견했습니다. 그것은 나에게 의미가 없기 때문에 나는 코드로 설명하려고 노력할 것이다.함수 계층 구조와 C 포인터 초기화 문제
typedef struct foo
{
int num1;
float num2;
char* name;
}foo;
//This function allocates and initializes a foo object
foo* Initfoo()
{
foo* f = malloc(sizeof(foo));
f->num1 = 1024;
f->num2 = 3.14;
f->name = malloc(100);
strcpy(f->name,"eleos re paidia");
//Just before returning here by checking the f pointer we can see
// it is initialized correctly
return f;
}
void afunctest(foo* f)
{
///... suppose this function does stuff before ...
//here it initializes the foo pointer
f = Initfoo();
///...and after here suppose the function also does more stuff..
//by checking at this point in the program the pointer is still initialized
//correctly to what InitFoo initialized it to
int asd =5;
}
int main()
{
foo* f = 0;
//should do stuff and also initialize the foo* f
afunctest(f);
//when we check here the pointer f is still 0 as if afunctest() function never ran
int asd = 5;
return 0;
}
기본적으로 몇 마디로, 우리는 foo 포인터를 선언하고 그것을 0으로 초기화합니다. 그런 다음 afunctest() 함수에 해당 포인터를 전달합니다.이 함수는 필요한 작업을 수행하고 나중에 사용하기 위해 초기화해야합니다. afunctest() 함수 안에는 올바르게 초기화 된 것처럼 보이지만 main()으로 돌아 가면 함수가 실행되지 않은 것처럼 여전히 0 값을 갖습니다.
처음에는 복잡한 프로그램 이었기 때문에 원래 프로그램에서 정말 복잡한 버그라고 생각했지만 여기에 그것을 복제 할 수 있다는 것은 C++에 비해 C에서 포인터 사용법에 대한 근본적인 것이 빠져 있음을 의미합니다. 당신은 사람들이 그것을 지적 할 수 있습니까? 내가 도대체 뭘 잘못하고있는 겁니까? 피드백에 대해 미리 감사드립니다.
P.S : 제 컴파일러는 당신은 f
의 로컬 사본을 변경
를 ++ 함수는 다른 서명이, 나 또한 거기에서 일하지 않을 것입니다 ... – sth