2013-09-21 2 views
2

여기에 Uni 지정 작업을하고 있는데 문제가 생겼습니다. for-loop를 사용하여 구조체 내부의 한 지점에 문자열 입력을 저장하려고합니다. 나중에 문자열을 가져 오기 위해 데이터가 저장된 장소에 대한 포인터를 사용하려고합니다. 이제 문제는 내가 for 루프 안에 들어가서 점의 주소도 변경된다는 것입니다. 이 코드 :할당없이 포인터 주소가 변경됨

B: 0x7fc111803200 
A: 0x7fc111803265 

B 전 값과 사후 복사된다 값 :

printf("B: %p\n", txt->point); 
for(i = 0; i < input_sz; i++) 
{ 
    txt->point[i] = input[i]; 
} 
printf("A: %p\n", txt->point); 

출력을 제공한다.

도움이되는 디버깅에 도움이 될 것입니다.


편집 :

구조체 :

struct text_storage { 
    char* start; 
    char* point; 
    char* end; 
} typedef text_t; 

초기화 기능 :

text_t* text_init(void *memory, size_t size) 
{ 
    text_t* to_return; 
    if(size < sizeof(text_t)) 
    { 
     return NULL; 
    } 
    to_return = (text_t*) memory; 
    to_return->start = to_return; 

    to_return->end = to_return->start + size; 
    to_return->point = to_return->start; 

    printf("Start: %p, point: %p, end: %p, end-start: %d\n", to_return->start, to_return->point, to_return->end, (to_return->end - to_return->start)); 


    return to_return; 
} 

텍스트 저장 방법이되는 에러가 발생 몇 가지 이상의 코드의

int text_store_entry(text_t *txt, const char *input, size_t input_sz) 
{ 
    int to_return; 
    char* begin = txt->point; 
    int i; 

    if(input_sz > (txt->end - txt->point)) 
    { 
     return -1; 
    } 

    printf("Start: %p, point: %p, end: %p, end-start: %d\n", txt->start, txt->point, txt->end, (txt->end - txt->start)); 


    printf("B: %p\n", txt->point); 
    for(i = 0; i < input_sz; i++) 
    { 
     txt->point[i] = input[i]; 
    } 
    printf("A: %p\n", txt->point); 

} 

홈페이지 기능 (테스트 목적으로 만 해당) :

int main(int argc, char* argv[]) 
{ 
    void* memory = malloc(10000); 
    char* a = "hei pa deg din trekkbasun"; 
    text_t* txt; 
    int memoverwritten; 

    txt = text_init(memory, 10000); 

    memoverwritten = text_store_entry(txt, a, (size_t)26); 


    printf("got through\n"); 
    return 0; 
} 
+3

선언 및 기타 코드를 표시하십시오. - 아마 정의되지 않은 동작 –

+0

더 많은 코드가 추가되었습니다. 감사합니다 @ GrijeshChauhan –

+0

하지만'text_store_entry()'함수를 어디에서 호출 할 수 있습니까? –

답변

3

아마 대부분의 문제 유형 struct text_storage의 구조의 초기화 때문이다. 이러한 구조에는 텍스트에 대한 세 개의 포인터가 들어 있습니다. 각 포인터는 malloc으로 초기화해야합니다. 귀하의 text_init 기능이 올바르게 작동하지 않습니다. 사실, start 포인터가 저장되는 위치는 사용하려는 메모리의 첫 번째 바이트와 겹칩니다.

typedef struct text_storage { 
    char* start; 
    char* point; 
    char* end; 
    char* data; 
} text_t; 

이 같은 함수로 초기화 :

나는이 같은 구조가 필요 같은데요

text_t text_init(void *memory, size_t size) 
{ 
    text_t to_return; 
    to_return.data = (char *) memory; 
    to_return.start = to_return.data; 
    to_return.end = to_return.start + size; 
    to_return.point = to_return.start; 
    return to_return; 
} 
+0

할당은 우리가 사용할 수있는 힙 공간이 text_init 함수에 전달 된 힙 공간임을 지정합니다. 이 블록 밖에서 힙 메모리를 예약 할 수 없습니다. 그 이유는 malloc이 없다는 것입니다. ( –

+0

위의'malloc'은 괜찮습니다.'memory'가 완전한 구조체를 저장하기를 원한다면 가변 크기의 마지막 필드를 가진 struct가 필요합니다. [here] (http://stackoverflow.com/questions/7641698/allocating-struct-with-variable-length-array-member)를 참조하십시오. – nickie

+0

데이터에 대한 또 다른 포인터를 사용하고 있습니까? 시작 및 끝 포인터를 null 길이 배열로 변경하는 방법? 그런 다음 0 바이트를 사용하고 메모리의 어딘가를 가리 킵니다. –

0

인쇄를 txt-> 루프의 지점과 지점을 참조 그것은 변화한다. 나는 txt-> point [0]에 할당 할 때 바뀌는 것으로 생각합니다. 필자는 printf에 익숙하지 않아 무엇이 인쇄되어 있는지 확신 할 수 없지만 배열의 이름은 첫 번째 위치를 참조합니다. printf가 포인터를 출력하고 있다면, txt-> point [i]는 항상 char 포인터이고, printf는 txt-> point를 역 참조 할 수 있습니다. 그러면 첫 번째 엔트리를 얻은 다음 주소를 보여줍니다. 포인트를 [i] 입력으로 변경할 때.

+0

그건 옳은 것 같습니다. 첫 번째 반복을 입력 할 때 점의 주소가 새 값 (처음부터 +65)으로 변경되고 루프 전체에이 값이 유지됩니다. 루프 내부에 txt-> point [i]의 주소를 출력 할 때마다 반복마다 4 바이트 씩 이동하는 것을 볼 수 있습니다. 우리가 숯을 저장하기 때문에 어떤 의미가 있습니다. –

+0

그런 경우, printf 명령문을 print & txt-> point [0]로 변경하십시오. 배열이 움직이지 않는다는 것을 보여주기를 바랍니다. 비록 내가 말했듯이 printf가 매 반복마다 바뀔 것이라고는 기대하지 않았지만, 그래서 궁금해합니다. –

+0

이러한 디버깅은 필요하지 않지만 문제는 분명합니다. 구조체가 초기화되는 방식에서,'txt','(txt-> start)'및'txt-> start'는 모두 같은 주소 ('memory')를 가리 킵니다. 텍스트 추가를 시작하면'txt-> start'의 값을 지 웁니다. – nickie