2012-10-27 2 views
0

memcpy가 내 프로그램에서 이상한 행동을합니다. 내 함수는 두 번 호출되므로 memcpy 행은 두 번 실행됩니다. 처음에는 문제가 없으며 두 번째 때는 gdb를 사용하여 해당 행에서 seg 오류가 발생합니다. 나는 왜 그것이 한 번 작동 할 것이지 두 번 이해할 수 없기 때문에 혼란 스럽다 ... 또한 내가 입력하는 두 개의 이름은 같은 길이이다. 이것은 내가 무엇을 가지고memcpy가 두 번째 시도에서 작동하지 않는 이유는 무엇입니까?

...

typedef struct _item_ 
{ 
    char name[500]; 
}item; 


int my_function(char *name) 
{ 

    item *myitem = malloc(sizeof(item)); 

    char* temp = myitem->name; 

    strcpy(temp, name); 

    /* code here to write add item to a global structure */ 

    return 0; 

은}

테스트 코드

...

int i; 
i = my_function("test1"); 
. 
. 
. 
i = my_function("test2"); 

그럼 내가 strcpy와이를 변경과 같은 문제가

발생
strcpy(temp, name); 

모든 ID 이것이 작동하지 않는 이유는 무엇입니까?

+0

'my_struct-> name'은 (는) –

+0

을 가리 킵니다. char [500] – spatara

+4

이것은 대답 할 수 없습니다. 주어진 정보 주어진 문제를 보여주는 컴파일 가능한, 최소한의 예제 게시 – interjay

답변

1

오, 그럼. 코드를 살펴 봐야합니다. 특히 대상 포인터에서 memcpy 또는 strcpy가 가리키는 포인터. 귀하의 메시지는 자신이 소유하지 않은 메모 리에 글을 쓰려고한다는 것을 분명하게 나타냅니다. 여기에 여러분이 제공 한 코드를 사용하는 최소한의 컴파일 가능한 버전이 있습니다. 그것은 잘 작동합니다. 함수가 호출되고 유효한 결과가 반환 된 20,000 번. 이것은 20,000 개의 모든 요소가 인쇄 될 때 확인됩니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct _item_ 
{ 
    char name[500]; 
}item; 

item *my_function(char *name) 
{ 
    item *myItem = (item*)malloc(sizeof(item)); 
    strcpy(myItem->name, name); 
    return myItem; 
} 

int main() 
{ 
    const int max = 10000; // 10,000 iterations 
    item *itemList[max*2]; // 2 operations per loop iteration 
    int j, index = 0; 
    for (j=0; j<max; j++) 
    { 
     itemList[index++] = my_function("test1"); 
     itemList[index++] = my_function("test2"); 
    } 

    index = 0; 
    for (j=0; j<max; j++) 
    { 
     printf("%d. - %s\n", 1+index, itemList[index]->name); 
     index++; 
     printf("%d. - %s\n", 1+index, itemList[index]->name); 
     index++; 
    } 
} 
3

이 경우에만 가능 범인 는 것 같다 :

(1)의 malloc()는 실패 - 당신은 NULL 결과

(2) 이전의 손상을 확인하지 않았다 것들을 뒤범벅했다.

메모리를 읽음으로써 세그먼트 오류가 발생할 수 있으므로 소스 인수가 0으로 끝나지 않고 오류가 발생하여 읽을 수있는 0 바이트가 발견되면 (그리고 500 문자 수신 배열을 오버런하기 전에) 세 번째 옵션이 추가 될 수 있습니다 다른 문제를 일으킨다.) 짧은 문자열 리터럴에서는 이런 일이 일어날 수 없으므로 이와 같은 것은 (2)에 해당된다.

주 프로그램 (메모리 누수 등)에 해킹당한 스 니펫이 실패하지 않았습니다. (hnhzflep의 답변은 좀 더 철저한 데모가 필요합니다.)

관련 문제