2011-09-15 12 views
4

저는 C 언어로 새로운데, 제가 발견 한 몇 가지 연습 문제를 시도하고 있습니다.C에서 포인터로 스택 오버플로

실습 중 하나에서 문자열 (char 배열)에 대한 포인터를 사용하려고하는데 작동하지 않습니다. 그것은 컴파일하지만 실행될 때 "스택 오버플로"가 발생합니다 (글쎄, 나는 "스택 오버플로"라고 생각합니다. 스페인어로 사용하기 때문입니다).

이 문제가있는 줄은 다음과 같습니다

//This is the variable declaration, before this, there is the "main function" declaration 
char entrada[100]; 
char *ult=entrada; 
char cantidadstr[10]; 
int i,j,k = 0; 
int res; 

scanf ("%s",entrada); 
printf ("\n%s",entrada); 

//Here crashes 
printf ("Hola %s",ult); 
while (*ult != "\0"){ 

//And here there's more code 

가 사전에 감사합니다!

편집

(나는 내 ​​질문에 대답 할 수 :)) 이 그럼, 코드의 좀 더 게시합니다.

내가 실행할 때 데이터를 삽입 한 후, 그것은 "Violación 드 segmento"가 발생하고, 구글은 그 스택 오버플로를 의미 말한다

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 
char entrada[1001*11*101]; 
/*Asi tenemos el tamano maximo: 
1001 por las 1000 posibles lineas, mas la primera 
11 por el tamano maximo del numero (1 + 9 ceros), mas el espacio o salto de linea siguiente 
101 por el numero de numeros por linea, mas el primero 
*/ 
char *ult=entrada; 
char cantidadstr[10]; 
int i,j,k = 0; 
int res; 

memset (entrada,'\0',1001*11*101); 
scanf ("%s",entrada); 
printf ("\n%s",entrada); 


//poniendo ese print ahi arriba, ese me lo muestra, por tanto, el fallo esta en el puntero de debajo de esta linea 
printf ("Hola %s",ult); 
while (*ult != "\0"){ 
    if(*ult == "\n"){ 
     if(i != 0){ 
      printf("\n"); 
     } 
     i++; 
     j = 0; 
    } 
    else if(i != 0){ 
     if(*ult == " "){ 
      j++; 
      k=0; 
      res = atoi(cantidadstr); 
      printf("%d ",res*2); 
      //Este es el otro cambio que hablaba 
      cantidadstr[10] = '\0';    
     } 
     else if(j != 0){ 
      cantidadstr[k] = *ult; 
     } 

    } 
    k++; 
    *ult++; 
} 
return 0; 

}

이 주석으로, 정확한 전체 코드 다른 포럼을위한 스페인어. "entrada"의 크기는 연습에서 보내는 모든 데이터에 대해 충분히 크다. "memset"이 방금 추가되었습니다. 두 번째 댓글은 어디에서 충돌이 발생하는지 보여줍니다.

빠른 답변 감사합니다 !! 이 컴파일하고 (지금까지 내가 생각할 수있는)

제대로 실행하지만 while 루프는 내가 그것을 귀하의 경우 컴파일하는 방법을 모르겠어요에 오류가로

+0

아마도 scanf에 100 자 이상의 입력을 입력하고 있습니까? 나는 또한 정확한 오류를보고 싶습니다, 심지어 스페인어로, google translate는 귀하의 freind입니다. –

+0

입력 한 문자열이 99자를 초과하지 않는 한 충돌하지 않아야합니다 ... – Torp

+0

5 분 후에도 긍정적 인 답변이 없으면 "더 많은 코드 게시"라고 말합니다. 뭔가 다른 곳에서 메모리를 손상 시켜서 문제가 발생할 가능성이 큽니다. –

답변

5

while 루프 전에 코드는 괜찮습니다. 당신은 작성했기 때문에 "\ 0" '\ 0'

+1

이 작품! 고맙습니다.나는 그것이 둘 다 사이의 차이라는 것을 몰랐다 !! 그리고 저는이 포럼을 아주 좋아합니다, 처음이지만 더 많이 사용하겠습니다 : D Thanks again !! – markmb

+0

컴파일 할 때 경고를 사용하십시오. gcc add -Wall –

2

다음 줄로 변환 할 필요가

*ult is of type char 
"\0" is of type const char* 

으로 컴파일러 오류 제공

while (*ult != "\0"){

:

cantidadstr[10] = '\0'; 

은의 끝 부분을 씁니다., 이것은 분명히 나쁘고 스택 오버플로의 원인이 될 가능성이 큽니다. cantidadstr을 null로 끝내려면 cantidadstr[9]= '\0';을 사용하십시오. C의 배열은 0부터 시작합니다. 따라서 배열의 첫 번째 요소 인 N[0]에서 시작하고 마지막 참조 할 수있는 요소는 [N-1]입니다.

+0

그가 실제로 cantidadstr [k] = '\ 0'을 원한다고 언급 할 수도 있습니다. 그리고 그것은 atoi 앞에 있어야합니다. –

+0

이것은 알려진 오류로, 변수를 지우고 싶었지만 문제가 없다고 확신했습니다. 감사 – markmb