memset을 수행하지 않으면 초기화되지 않은 값이 힙 할당에 의해 생성되었습니다.

Strahinja Djuric

내가 관심있는 것은 이것입니다.

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");
}

감사!

chqrlie

이 문제는에서 반환 된대로 초기화되지 않은 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Valgrind : 초기화되지 않은 값이 힙 할당에 의해 생성되었습니다.

분류에서Dev

힙 할당 오류로 인해 CS50 Speller 초기화되지 않은 값이 생성되었습니다.

분류에서Dev

스택 할당에 의해 초기화되지 않은 값이 생성되었습니다-Valgrind

분류에서Dev

분할은 초기화되지 않은 값을 생성합니다.

분류에서Dev

보안을 위해 힙이 0으로 초기화 된 경우 스택이 단순히 초기화되지 않은 이유는 무엇입니까?

분류에서Dev

startRecording ()이 삼성 S7 휴대폰의 초기화되지 않은 AudioRecord에서 호출되었습니다.

분류에서Dev

생성자에서 초기화 된 JavaScript 프로토 타입 속성이 할당 된 새 프로토 타입으로 재정의되지 않습니다.

분류에서Dev

Rails 3.2 : 중첩 속성에 값을 할당 할 때 "초기화되지 않은 상수"

분류에서Dev

Jvm 힙 덤프가 신호에 의해 생성되지 않습니다.

분류에서Dev

SSD 및 HDD를 완전히 공장 초기화하고 할당되지 않은 공간에서 볼륨을 생성하려면 어떻게해야합니까?

분류에서Dev

Tomcat : xmx / xms 값이 설정되지 않았습니다. 힙 값은 어디에 정의되어 있습니까?

분류에서Dev

초기화되지 않은 변수의 값을 예측하는 방법이 있습니까?

분류에서Dev

배열이 이미 초기화 된 경우에도 "정의되지 않은 속성을 설정할 수 없습니다."

분류에서Dev

Ionic 2 modalcontroller 초기화 오류, 정의되지 않은 속성 생성을 읽을 수 없습니다.

분류에서Dev

초기화되지 않은 함수의 전역 변수 값에 액세스 할 수 없습니다.

분류에서Dev

빈 배열을 열거하면 힙에 할당되지 않는 이유는 무엇입니까?

분류에서Dev

레거시 부팅이 활성화되었을 때 GRUB가 시작되지 않습니다. 그렇지 않으면 시작되지만 Debian에 오류가 발생하고 시작되지 않습니다.

분류에서Dev

초기화되지 않은 변수의 값은 어디에서 나옵니까?

분류에서Dev

설정 속성을 사용하여 생성자 함수의 실행 컨텍스트에 정의 된 값을 설정해도 값이 변경되지 않는 이유를 이해할 수 없습니다.

분류에서Dev

다른 열의 해당 행에 특정 하위 문자열이 포함되어 있으면 열에 문자열을 할당하고 그렇지 않으면 다른 문자열을 할당합니다.

분류에서Dev

valgrind가 변수를 초기화되지 않은 것으로 처리하도록 초기화되지 않은 데이터로 변수를 의도적으로 초기화하려면 어떻게해야합니까?

분류에서Dev

배열에 값을 할당하면 값이 유지되지 않습니까?

분류에서Dev

레일의 하위 폴더에 클래스가 있으면 초기화되지 않은 상수 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

뷰에서 3 개의 테이블을 조인 할 때 초기화되지 않은 상수 오류

분류에서Dev

초기화되지 않은 변수가 TryParse 내부에 값이 설정된 후 다시 할당되지 않는 이유는 무엇입니까?

분류에서Dev

CKEDITOR의 초기화 기능이 실행되지 않습니다.

분류에서Dev

개체의 반응 상태 배열을 다시 초기화하면 정의되지 않은 값이 발생합니다.

분류에서Dev

초기화되지 않은 변수가 항상 정의되지 않은 유형이면 안됩니다.

분류에서Dev

해제되는 포인터가 이전에 할당되었지만 할당되지 않았습니다.

Related 관련 기사

  1. 1

    Valgrind : 초기화되지 않은 값이 힙 할당에 의해 생성되었습니다.

  2. 2

    힙 할당 오류로 인해 CS50 Speller 초기화되지 않은 값이 생성되었습니다.

  3. 3

    스택 할당에 의해 초기화되지 않은 값이 생성되었습니다-Valgrind

  4. 4

    분할은 초기화되지 않은 값을 생성합니다.

  5. 5

    보안을 위해 힙이 0으로 초기화 된 경우 스택이 단순히 초기화되지 않은 이유는 무엇입니까?

  6. 6

    startRecording ()이 삼성 S7 휴대폰의 초기화되지 않은 AudioRecord에서 호출되었습니다.

  7. 7

    생성자에서 초기화 된 JavaScript 프로토 타입 속성이 할당 된 새 프로토 타입으로 재정의되지 않습니다.

  8. 8

    Rails 3.2 : 중첩 속성에 값을 할당 할 때 "초기화되지 않은 상수"

  9. 9

    Jvm 힙 덤프가 신호에 의해 생성되지 않습니다.

  10. 10

    SSD 및 HDD를 완전히 공장 초기화하고 할당되지 않은 공간에서 볼륨을 생성하려면 어떻게해야합니까?

  11. 11

    Tomcat : xmx / xms 값이 설정되지 않았습니다. 힙 값은 어디에 정의되어 있습니까?

  12. 12

    초기화되지 않은 변수의 값을 예측하는 방법이 있습니까?

  13. 13

    배열이 이미 초기화 된 경우에도 "정의되지 않은 속성을 설정할 수 없습니다."

  14. 14

    Ionic 2 modalcontroller 초기화 오류, 정의되지 않은 속성 생성을 읽을 수 없습니다.

  15. 15

    초기화되지 않은 함수의 전역 변수 값에 액세스 할 수 없습니다.

  16. 16

    빈 배열을 열거하면 힙에 할당되지 않는 이유는 무엇입니까?

  17. 17

    레거시 부팅이 활성화되었을 때 GRUB가 시작되지 않습니다. 그렇지 않으면 시작되지만 Debian에 오류가 발생하고 시작되지 않습니다.

  18. 18

    초기화되지 않은 변수의 값은 어디에서 나옵니까?

  19. 19

    설정 속성을 사용하여 생성자 함수의 실행 컨텍스트에 정의 된 값을 설정해도 값이 변경되지 않는 이유를 이해할 수 없습니다.

  20. 20

    다른 열의 해당 행에 특정 하위 문자열이 포함되어 있으면 열에 문자열을 할당하고 그렇지 않으면 다른 문자열을 할당합니다.

  21. 21

    valgrind가 변수를 초기화되지 않은 것으로 처리하도록 초기화되지 않은 데이터로 변수를 의도적으로 초기화하려면 어떻게해야합니까?

  22. 22

    배열에 값을 할당하면 값이 유지되지 않습니까?

  23. 23

    레일의 하위 폴더에 클래스가 있으면 초기화되지 않은 상수 오류가 발생하는 이유는 무엇입니까?

  24. 24

    뷰에서 3 개의 테이블을 조인 할 때 초기화되지 않은 상수 오류

  25. 25

    초기화되지 않은 변수가 TryParse 내부에 값이 설정된 후 다시 할당되지 않는 이유는 무엇입니까?

  26. 26

    CKEDITOR의 초기화 기능이 실행되지 않습니다.

  27. 27

    개체의 반응 상태 배열을 다시 초기화하면 정의되지 않은 값이 발생합니다.

  28. 28

    초기화되지 않은 변수가 항상 정의되지 않은 유형이면 안됩니다.

  29. 29

    해제되는 포인터가 이전에 할당되었지만 할당되지 않았습니다.

뜨겁다태그

보관