2012-04-21 9 views
1

다음 C 코드를 컴파일하려고하면 버스 오류가 발생합니다. 필자는 memcpy를 호출하는 방식과 관련이 있다고 추측합니다. 그러나 알아낼 수는 없습니다. 도움이 될 것입니다. 과제 후, NOT하여 할당 된 메모리에버스 오류 : 10. C 코드, malloc 예

다음 p 점 리터럴 문자열
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p 
    p = "hello"; 


    char *name = (char*)malloc(sizeof(char)*11); 
    // Assign some value to name 
    name = "Bye"; 

    memcpy (p,name,sizeof(char)*10); // Problem begins here 
    return 0; 
} 
+0

기타 참고 사항 : [malloc의 반환 값을 캐스트하지 마십시오] (http://stackoverflow.com/questions/605845/). 'strncpy'와 비슷한 함수가 그 목적을 위해 존재할 때 왜 * 문자열 *을 복사하는데'memcpy'를 사용하고 있습니까? – DCoder

답변

8

!

그런 다음 memcpy으로 해당 메모리에 쓰려고합니다.

많은 C 컴파일러가 읽기 전용 메모리에 문자열 리터럴을 할당하므로 버스 오류가 발생합니다.

이 문제를 해결하려면, 당신은 로 복사 한 문자의 시간, 당신은 strncpy를 사용하여, main의 첫 번째 줄에 p에 할당 된 공간에 전자, L, L, 그리고 오. 이렇게하면 p이 자신이 할당 한 메모리를 가리 킵니다. 나중에 memcpy은 괜찮을 것입니다 (물론 버퍼 오버 플로우가 없다면).

일반적으로 문자열 변수에 직접 지정하면 변수의 지점을 다른 메모리 주소로 지정하게됩니다. 코드에서 두 개의 문자열에 대한 공간을 할당했지만 변수에 문자열 리터럴을 할당하면 해당 변수가 가리키는 위치가 변경되어 메모리 누수가 발생합니다.

+0

p에 쓸 수있는 방법이 있습니까? – Sid

+0

수정 사항에 답변. –

+0

고마워요! 나는 이것을 잠시 동안 알아 내려고 노력했다. – Sid

0

코드에서 p = "hello""hello"hello 문자열을 가리키는 포인터를 반환하며 변경되지 않습니다. p = "hello"을 사용하면 p도이 문자열을 가리 킵니다. 따라서 변경하려고하면 오류가 발생합니다. char a[] = "hello"; 또는

char *a = malloc(sizeof(char)*11); /*cast is not good*/ 
strcpy (a, "hello"); 

BTW, (char *) 또는 (int *) 같은 캐스트를 사용하여 더 나은했으나, malloc을 사용하여 다음과 같은 올바른 방법입니다.