2014-02-24 6 views
0

안녕하세요, 왜이 코드는 마지막 복사본에서 오류가 발생했는지 알 수 없습니다. b) 디버거에서 0부터 4까지를 포함하는 그림 [0] 사진 1)문자열을 문자열 배열로 복사

char picture[5][5]; 
strcpy(picture[0], "#####"); 
strcpy(picture[1], "#####"); 
strcpy(picture[2], "#####"); 
strcpy(picture[3], "#####"); 
strcpy(picture[4], "#####"); 

엑스 코드 오류가 당신은 당신이 문자열을 종료 null 바이트 필요하다는 것을 잊고 다음

enter image description here

답변

1

을 보여줍니다. (. 사실, 당신의 마지막 strcpy()가 정의되지 않은 동작을 호출, 배열의 범위를 벗어난 기록)을 사용

char picture[5][6] = { "#####", "#####", "#####", "#####", "#####", }; 

이 너무 strcpy() 전화에 저장합니다.


내가 댓글 :

는 6 5로 변경,하지만 난 그게 종료를 삭제해야하더라도 (가 초기화를 할 수 있도록해야합니다 생각하는 경우도 경고를 생성 할 수 있습니다 컴파일러 null 바이트). 그러나 당신이 고치기를 원한다는 경고입니다. 그것은 진짜 문제를 보여주고 있습니다.

실제로 GCC 4.8.2는 상당히 엄격한 컴파일 옵션에서이 문제에 대해 경고하지 않습니다.

편집 :

gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols 

코드 :

#include <stdio.h> 

static char picture1[5][5] = { "#####", "#####", "#####", "#####", "#####", }; 
static char picture2[5][6] = { "#####", "#####", "#####", "#####", "#####", }; 

int main(void) 
{ 
    for (int i = 0; i < 5; i++) 
     printf("%s\n", picture1[i]); 
    for (int i = 0; i < 5; i++) 
     printf("%s\n", picture2[i]); 
    return 0; 
} 

출력 : C 문자열에서

######################### 
#################### 
############### 
########## 
##### 
##### 
##### 
##### 
##### 
##### 
+0

감사합니다. 생각 나는 당신이 전에 준 구문을 시도하고 그것은 (그것은 null 바이트 문제가되었을 수도 있지만) 작동하지 않았다. – Zimm3r

+0

6에서 5로 변경하면 컴파일러에서 경고를 생성 할 수 있지만 이니셜 라이저를 허용해야한다고 생각합니다 (종료 null 바이트를 삭제해야 함에도 불구하고). 그러나 당신이 고치기를 원한다는 경고입니다. 그것은 진짜 문제를 보여주고 있습니다. –

+0

나중에 끝내지 않을 루프 용으로 모두 사용 했으므로 나중에 실제로 사용하지 않았습니다. 감사 – Zimm3r

3

캐릭터 \0로 끝납니다. 그래서 당신은 같은 배열을 선언하여 그들을위한 공간을 확보한다

char picture[5][6]; 
2

당신이 char str[n]를 선언 할 때 n-1 문자가 당신을 위해 예약되어 의미합니다. 마지막 것은 '\ 0'char (종결 자)입니다. '\ 0'문자를 덮어 쓰면 메모리에 '\ 0'이 발견 될 때까지 계속 인쇄됩니다. 당신이 strings.h에서 기능을 사용 할 때마다

그래서 char picture[5][6];

0

char picture[5][5];을 수정, 그렇지 않으면 당신은 항상 문자열의 끝에서 예상치 못한 결과를 얻을 것이다, 당신은 "\ 0"알아서 확인 (특히 %으로 인쇄 할 때). 컴파일러는 잘못된 것을 발견하지 못하기 때문에 경고를하지 않을 것입니다. %으로 인쇄 할 때 컴파일러는 "\ 0"을 찾고 프로그램을 실행할 때까지 인쇄를 계속합니다. 실제로 strncpy를 사용할 때 어레이 크기가 9이고 5 만 사용하면 나머지 4는 null이 저장됩니다.

관련 문제