내가 관심있는 것은 이것입니다.
char *assign_value = (char*)malloc(10 * sizeof(char));
if(strlen(assign_value) == 0) {
strcpy(assign_value, "A");
} else {
strcat(assign_value, "A");
}
기본적으로 위의 예에서는 초기화되지 않은 값이 힙 할당에 의해 생성되었다는 오류가 발생합니다. 그러나 내가 다음 일을하고 malloc ()과 if 문 사이에 memset ()을 삽입하면 동일한 오류가 표시되지 않습니다. 몇 가지 제안을 듣고 싶습니다. 이것이 올바른 방법입니까? 그렇지 않다면 옳은 일이 무엇입니까?
char *assign_value = (char*)malloc(10 * sizeof(char));
memset(assign_value, 0, sizeof(assign_value));
if(strlen(assign_value) == 0) {
strcpy(assign_value, "A");
} else {
strcat(assign_value, "A");
}
감사!
이 문제는에서 반환 된대로 초기화되지 않은 strlen(assign_value)
시기 를 호출 할 때 발생 assign_value
합니다 malloc(10)
.
문제 를 해결 하는 세 가지 방법은 다음과 같습니다 .
를 사용하여 배열의 모든 바이트를 수동으로 설정할 수 있습니다 memset(assign_value, 0, 10);
. sizeof(assign_value)
배열의 크기가 아니라 포인터의 크기 로 평가할 때 호출이 올바르지 않습니다 .
배열을 calloc(10, sizeof(char))
. calloc
모든 비트 0으로 초기화 된 메모리 블록의 주소를 반환합니다. 이는를 호출하는 것과 동일한 효과를 memset
갖지만 잠재적으로 더 효율적입니다.
당신은 할 초기 바이트를 설정할 수 있습니다 '\0'
배열 모두에 사용할 유효한 빈 문자열, 수 있도록 strcpy
하고 strcat
.
calloc()
대신 사용 하는 것은 사용 malloc()
하기 전에 할당 된 데이터의 일부 또는 전부를 초기화하지 못하는 경우 예기치 않은 동작을 방지하는 좋은 습관입니다.
코드가 근본적으로 단순화 할 수 있다는 것을 참고 : 대상 문자열이 실제로 비어있는 경우, 호출은 strcat()
이다 에 해당 strcpy()
. 다음과 같이 작성할 수 있습니다.
char *assign_value = calloc(10, sizeof(char));
...
strcat(assign_value, "A");
또한 strcat()
버퍼에 이미 저장된 문자열의 길이를 확인하여 버퍼 오버플로가 발생하지 않는지 확인해야합니다 .
char *assign_value = calloc(10, sizeof(char));
...
if (strlen(assign_value) < 10 - 1) {
strcat(assign_value, "A");
} else {
// handle the error: not enough space in assign_value
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다