포인터 변수 (반환되지 않음)를 통해 함수 내에서 지역 변수를 전달하려고합니다.함수의 지역 변수를 매개 변수로 다시 전달합니다.
내 할당은 스택 데이터 구조를 사용하며, 사용해야하는 기준 중 하나는 Pop() 함수가 스택의 맨 위에있는 항목을 반환하는 데 사용되는 포인터 매개 변수를 가져야한다는 것입니다. 나는 이것을 전에 사용했다. 내 프로그램이 데이터 구조체와 더 복잡 해짐에 따라 세그멘테이션 오류가 발생하거나 함수 프레임이 팝 된 후 데이터가 저장되지 않습니다.
// Definitions
typedef char * string;
typedef enum { SUCCESS, FAIL } result;
typedef enum { INTEGER, DOUBLE, STRING } item_tag;
// Result Check
static result RESULT;
// Item_Tag
typedef struct {
item_tag tag;
union {
int i;
double d;
string s;
} value;
} item;
// Declarations
int STACK_SIZE = 0;
const int MAX_STACK_SIZE = 1024; // Maximum stack size
item stack[1024];
// Pop
result Pop(item *ip){
item poppedItem;
item * pointerReturn = malloc(sizeof(item));
// Check stack size is not 0
if(STACK_SIZE == 0){
return FAIL;
}
// If stack size is only 1, creates a blank stack
else if(STACK_SIZE == 1){
item emptyItem;
// Initialize
emptyItem.tag = INTEGER;
emptyItem.value.i = 0;
// Check top item's tag
poppedItem = stack[0];
// Store top item data based on tag
switch(stack[0].tag){
case STRING:
poppedItem.value.s = stack[0].value.s;
case DOUBLE:
poppedItem.value.d = stack[0].value.d;
default:
poppedItem.value.i = stack[0].value.i;
}
poppedItem.tag = stack[0].tag;
// Allocate memory for parameter, and have it point to poppedItem
ip = malloc(sizeof(poppedItem));
*ip = poppedItem;
// Store empty stack to top of stack
stack[0] = emptyItem;
// Decrease stack size
STACK_SIZE--;
}
// Grab top Item from stack
else{
// Check top item's tag
poppedItem = stack[0];
// Store top item data based on tag
switch(stack[0].tag){
case STRING:
poppedItem.value.s = stack[0].value.s;
case DOUBLE:
poppedItem.value.d = stack[0].value.d;
default:
poppedItem.value.i = stack[0].value.i;
}
poppedItem.tag = stack[0].tag;
// Allocate memory for parameter, and have it point to poppedItem
ip = malloc(sizeof(poppedItem));
*ip = poppedItem;
// Reshuffle Items in Stack
for(int idx = 0; idx < STACK_SIZE; idx++){
stack[idx] = stack[idx + 1];
}
STACK_SIZE--;
}
return SUCCESS;
}
포인터에 관한 나의 지식은 괜찮으며, 메모리 위치/관리. 그러나 어떤 방법 으로든 전문가가 될 수 있다고 주장 할 수는 없습니다. 필자는 데이터를 다시 전달하는 수단으로 함수의 자체 포인터 매개 변수를 사용할 때 배경에서 어떤 일이 발생하는지 정확히 알지 못합니다.
- 이 문제를 해결하기위한 올바른 구문은 무엇입니까?
- 어떻게 매개 변수를 전달할 수 있습니까?
미리 감사드립니다.
EDIT * 많은 사람들이 혼란 스럽습니다. 나는 약간의 발췌 문장을 게시 할 것이다. 이 과제는 과제이므로 부적절한만큼 온라인으로 게시 할 수는 없습니다. 하지만 함수 자체를 게시하고 사람들이 분석하도록하는 것이 좋습니다. 나는 해결책을 찾기 위해 수십 번 편집했기 때문에 다소 지저분한 일이라고 생각합니다. 혼란을 드려 죄송합니다. 모든 코드가있는 것은 아닙니다. 문제의 기능과 구조의 일부.
item catcher;
myFunc(&catcher); // Pass a pointer to catcher
을하고 함수는 포인터를받은 개체를 수정해야합니다 :
는 C 또는 C++인가? 둘 다 함께 태그하지 마십시오. – iBug
당신은 포인터에 대한 지식이 괜찮다고 주장했지만, 나는 catcher.variable이 누군가 현명한 사람에 의해 쓰여졌다 고 생각하지 않는다. 점 대신에'->'를 써야합니까? – iBug
@Ron이 말한 것에 덧붙여, C를 배우면이 [C 책 모양] (/ q/562303/5958455)을 살펴 봐야합니다. – iBug