일부 코드로 내 질문을 지원할 수 없다는 것을 유감스럽게 생각합니다. (어떻게 받아 들일 수 있는지 이해하지 못했지만) 어쨌든 시도합니다.포인터 스택
올바르게 이해하면 동일한 유형의 구조체를 참조하는 구조체는 참조를 위해 포함 된 포인터로이를 수행해야합니다. 이 포인터가 조각화 오류를 만들지 않고 스택의 할당 된 공간 (힙 대신)을 참조 할 수 있습니까? -
어떻게 신고해야합니까?
이일부 코드로 내 질문을 지원할 수 없다는 것을 유감스럽게 생각합니다. (어떻게 받아 들일 수 있는지 이해하지 못했지만) 어쨌든 시도합니다.포인터 스택
올바르게 이해하면 동일한 유형의 구조체를 참조하는 구조체는 참조를 위해 포함 된 포인터로이를 수행해야합니다. 이 포인터가 조각화 오류를 만들지 않고 스택의 할당 된 공간 (힙 대신)을 참조 할 수 있습니까? -
어떻게 신고해야합니까?
이예,하지만 그 스택 프레임을 제공하는 방법은 반환하지 않은 경우에만 스택에 변수에 대한 포인터를 사용할 수 있습니다. 예를 들어이 작동합니다 : 이것은 스택 프레임으로, 그러나 오류가 발생합니다
typedef struct
{
int a;
float b;
} s;
void printStruct(const s *s)
{
printf("a=%d, b=%f\n", s->a, s->b);
}
void test()
{
s s;
s.a = 12;
s.b = 34.5f;
printStruct(&s);
}
이 사라진 것 :
s *bad()
{
s s;
s.a = 12;
s.b = 34.5f;
return &s;
}
편집 : 그럼 난이 오류가 발생합니다 말하지만, 동안
: 내가 컴파일시 경고가int main()
{
test();
s *s = bad();
printStruct(s);
return 0;
}
:와 그 코드를 호출
$ ./s
a=12, b=34.500000
a=12, b=34.500000
를하지만 사실, 깨진 :
s.c:27:5: warning: function returns address of local variable [enabled by default]
프로그램이 잘 작동이 나타납니다.
:이 예에서는
typedef struct str_t_tag {
int foo;
int bar;
struct str_t_tag *pNext;
} str_t;
str_t str1;
str_t str2;
str1.pNext = &str2;
str1이 모두와 str2가 스택에 있지만, 둘 중 하나 또는 모두가 힙에있는 경우에도 작동합니다. 당신이주의해야 할 유일한 것은 스택 변수가 범위를 벗어날 때 압축 될 것이라는 것입니다. 따라서 str1을 동적으로 할당하고 함수에서 다시 전달하면 str1 -> pNext가 가리키는 것을 원하지 않을 것입니다 그 함수 내에서 스택에 있던 것.
즉,이 작업을 수행하지 마십시오 :
typedef struct str_t_tag {
int foo;
int bar;
struct str_t_tag *pNext;
} str_t;
str_t *func(void)
{
str_t *pStr1 = malloc(sizeof(*pStr1));
str_t str2;
pStr1->pNext = &str2;
return pStr1; /* NO!! pStr1->pNext will point to invalid memory after this */
}
이것이 구체적으로 C/C++ 질문 일 경우 확실하지 않지만 어쨌든 C/C++ 코드를 예제로 제공하겠습니다.
유일한 방법 당신은 그것을 선언 할 수 있습니다 : (약간의 변화와 함께) 다음과 같이
typedef struct abc
{
struct abc *other;
} abc;
other
가 스택에 객체를 가리킬 수 있습니다 :
abc a, b; // stack objects
b.other = &a;
이이 범위에 대한 질문이 아니다 , 위의 작업을 수행 할 때 발생할 수있는 문제에 대해서는 언급하지 않겠습니다.
그러나 동적으로 생성 된 개체에 할당하려는 경우이 개체를 스택에 저장할 수있는 방법이 없습니다.
abc b;
b.other = malloc(sizeof(abc)); // on the heap
선언 할 때 특별한 것은 없습니다. 포인터가 스택, 힙 또는 NULL을 가리킬 지 여부는 포인터를 포함하는 구조가 선언되는 방법에 영향을 미치지 않습니다. –