2011-09-15 169 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」只是添加。第二個評論顯示它崩潰的地方

感謝您的快速回答!

+0

您是否可能在scanf中輸入了超過100個字符的輸入內容?我也希望看到確切的錯誤,即使是西班牙文,但谷歌翻譯是你的朋友在那裏。 –

+0

不應該崩潰到那裏,除非你輸入的字符串超過99個字符... – Torp

+0

好吧,如果5分鐘後,我們沒有正面答案,我會說「發佈更多的代碼」,因爲有在其他地方可能會破壞造成問題的記憶的可能性很大。 –

回答

5

while循環之前的代碼是好的,因爲它編譯並運行正常(只要我能想到的)

但while循環有一個錯誤我不知道它在你的情況如何編譯。 因爲你已經寫

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

這給作爲

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

你要轉換 「\ 0」 '\ 0'

+1

這工作!非常感謝你。我不知道這是兩者之間的差異!我喜歡這個論壇,這是第一次,但我會多用幾次:D再次感謝! – markmb

+0

嘗試在編譯時使用警告,例如。用gcc add -Wall –

2

以下行編譯器錯誤:

cantidadstr[10] = '\0'; 

將寫過的末尾,這絕對是不好的,最有可能導致你的堆棧溢出。如果您要終止cantidadstr,請使用cantidadstr[9]= '\0';。 C中的數組是基於零的,不是基於數組的,所以大小爲N的數組的第一個元素開始於[0]並且最後的可參考元素是[N-1]

+0

可能還提到他實際上想要cantidadstr [k] ='\ 0';它應該在atoi之前。 –

+0

這是一個已知的錯誤,我想清理變量,但我確定問題不在那裏。謝謝 – markmb