처음에는 C 언어에 익숙하지 않았으므로 여기에 근본적인 오해가있을 것입니다. 이와 같은 감안할 코드 :특정 크기의 문자 배열 Malloc 대 문자 배열
int main()
{
char ack[100];
char *bar;
bar = malloc(100);
strncpy(ack, "testing", 7);
bar = "testing";
return 0;
}
ack
GDB에 의해 조사 다음과 같습니다
(gdb) p ack
$1 = "testing\000\360WV\000\000\000\000\000\277\000\000\000\000\000\000
'\000'\000\220\[email protected]",<repeats 13 times>, "\003\[email protected]", '\000' <repeats 13 times>
"\325,\[email protected]\000\000\000\000\000H\214\246\367\377\177\000\000\220\[email protected]",
'\000' <repeats 13 times>, "P\[email protected]\000\000\000\000\000\360\342\377\377"`
이것은 내가 ack
을 초기화하는 방법을 나에게 주어진에 의미가 있습니다.
(gdb) p bar
$2 = 0x40066c "testing"
내가 스토리지의 동일한 금액을 할당 (내가 아는까지로) 내가
ack
을위한 공간을 요청했을 때 그랬던 것처럼하지만 malloc을 가지고 있지 않습니다 내가 확실히하지 않는 것은
bar
이 보이는 이유 여분의 쓰레기. 알다시피, malloc은 어떤 종류의 데이터 초기화도하지 않기 때문에 다소 혼란 스럽습니다. 그 이유는 내가 strstr을 가지고 겪었던 문제이다. 기본적으로 파일 (fgets)에서 데이터를 읽을 때 특정 크기의 char 배열로 strstr()이 실패합니다 (여분의 정크가 있다고 가정하고 있음). 포인터로 작업하고 malloc 된 메모리는 정상적으로 작동했습니다. 어쨌든 몇 가지 구체적인 질문이 있습니다.
이 malloc'd 변수의 동작이 예상됩니까? 여기에 최적화가 진행 중입니까 (gcc로 컴파일되었지만 최적화가 수행되지 않았습니까?) 아니면 gdb가 모든 것을 보여주지 않습니까? 해당 변수와 관련된 "정크"가 있어야합니까?
malloc을 올바르게 사용하고 있습니까? 내가 요청한 모든 메모리를 초기화해야합니까? 그렇다면 어떻게?
고맙습니다!
편집 응답 모든 사람에게
감사합니다! 나는 당신에게서 모든 것을 아주 많이 배웠고 많은 도움을 받았습니다. 이제 위의 코드와 fgets() 및 strstr()에 대한 문제를 확인합니다.
메모리가 할당되면 메모리가 Null로 채워지지 않습니다. 그걸 사용하려면 memset (..) – Adrian
@ 애드 리안, 아니, 아니. 이것은'C'입니다. 'malloc()'을 사용하지 말고'C '에 대해 새로운 것을 가르쳐주지 마라. –
@DanFego 나는 또한 나는 하하를 추측하고있다. 나는 항상 mallocs를 캐스팅했습니다. 정보 주셔서 감사합니다. 내 의견을 편집했습니다! – Adrian