2012-10-09 3 views
-1

내 코드가 작동하지 않습니다. 문자열을 받아들이는 순간 런타임 오류가 발생합니다. 이 코드의 문제점은 무엇입니까?오류 읽기 문자열

//this is what i have in main() 
char *ele,*s[max]; 
int *count,temp=0; 
count=&temp; 
printf("Enter string to insert: "); 
scanf("%s",ele); 
addleft(s,ele,count); 

//following is the function definition 
void addleft(char *s[max],char *ele,int *count) 
{ 
    int i; 
    if((*count)==max) 
    { 
     printf("Queue full!\n"); 
     return; 
    } 
    for(i=*count;i>0;i--) 
     strcpy(s[i],s[i-1]); 
    strcpy(s[0],ele); 
    (*count)++; 
    printf("String inserted at left!\n"); 
} 
+3

제목을 "잘못된 코드 입력이 잘못된 입력 문자열 처리로 연결됩니다"로 변경했습니다. 제목이 잘못된 코드의 입력 문자열을 비난하는 것처럼 들립니다. ;-) –

+0

죄송합니다. 제목에 신경 쓰지 마세요. 이 시점에서 나에게 더 중요한 것은 내가이 tom을 제출해야하는 코드이다. :) – user1727119

답변

3

ele가 초기화되지 않은 char*이며 scanf() 및 그것을 정의되지 않은 동작을 일으키는 쓰기 시도한다과 관련된 메모리를 가지고 있지 세그먼트 오류가 가능한 것이다. scanf() 사용시

하면 동적으로 ele 메모리를 할당하거나 로컬 배열을 선언하고 버퍼 오버런을 방지해야

char ele[1024]; 
if (1 == scanf("%1023s", ele)) 
{ 
    /* Process 'ele'. */ 
} 

또한 기능 addleft()sstrcpy()을 사용하고, char* 배열 인 배열의 각 char*은 unitialised입니다. 이는 정의되지 않은 동작 및 가능한 세그멘테이션 오류입니다. 그것은 그렇지 않으면 malloc()strcpy() 사용할 수있는 경우 해결하려면 strdup()을 사용할 수 s에 포함 된 char*는 반드시 같은 길이의 수 있습니다으로 addleft() 기능 내부의 for 루프가 위험하다

/* Instead of: 
     strcpy(s[0],ele); 
    use: 
*/ 
s[0] = strdup(ele); 

참고. 이것은 쉽게 배열의 끝을 넘어 쓰기로 이어질 수 있습니다. 그러나 요소는 동적으로 할당 된 주소 인 char*이므로 내용을 복사하는 대신 요소를 바꿀 수 있습니다.

0

sscanf ("% s", ele)가 'ele'가 가리키는 메모리에 입력을 넣습니다. 그러나 '엘'은 결코 아무 것도 가리 키도록 초기화되지 않았습니다. 뭔가 같이 :

char ele[128]; 

또는

char* ele = malloc(...) 

는 그것을 수정해야합니다.

-1

ele 포인터가 할당 된 메모리를 가리키고 있지 않기 때문에 버퍼 오버플로가 발생합니다. 프로그램이 실행해야하는 메모리에 쓰기 때문에 충돌이 일어납니다.

char *ele; 
if (!(ele = malloc(50))) //allocate 50 bytes of memory 
{ 
    //allocation failed 
    exit(0); 
} 
scanf("%s", ele); //string can hold 50 bytes now 
free(ele);  //free allocated space 
이 당신은 malloc 기능을 읽을 수도 있습니다

here

더 쉬운 경로가 단지 ele 대신 포인터의 배열 할 것이다 : 나는 당신이이 같은 프로그램에 malloc을 구현하는 것이 좋습니다

char ele[50]; //ele is an array of 50 bytes