Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucasseribeiro

O mistério do "stack smashing detected" !

Recommended Posts

Olá, pessoal,

 

eu estou tentando criar um loop "for" que leia uma string e imprima na tela, a cada loop, o caractere da posição "i" da lida no loop (veja o código).

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

int main(void) {

    int i;
    char string[99];
    char *pst = &string[99];
    printf("String:\t");
    scanf("%[^\n]s",&string[99]);
    for(i = 0; pst[i]!='\0'; i++);
    printf("%d",i);

    return(0);
}

O código funciona, mas tem uma variável estourando que não consigo encontrar. A mensagem de erro é:

String:    "string digitada"
17*** stack smashing detected ***: /home/camatue/Sistemas/workspace/project_scoop/Debug/project_scoop terminated

Eu gostaria muito de tirar a roda desse buraco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, olhe bem sua declaração do vetor

 char string[99];

Logo em seguida você tenta fazer o ponteiro apontar para a última posição deste vetor

 char *pst = &string[99];

Quando você o declarou com a capacidade 99 e logo em seguida tentou acessar o último elemento usando este valor de capacidade que é "99", pois bem, como você tem um vetor de capacidade 99 sua última posição é 98, porque para acessar elementos de vetor se começa contando do 0 (que seria o primeiro elemento).

 

no seu scanf

 scanf("%[^\n]s",&string[99]);
 
//poderia ter feito assim:
 
scanf("%[^\n]s", string);

//o só "string" é poque o vetor sempre aponta para o primeiro endereço de memoria, sendo possivel você somar string + 2 que você pegaria o terceiro elemento. seria como 0x0F0 (Endereço do primeiro elemento) + 2 = 0x0F2 vualá!!!

 

você esta tentando jogar o que foi digitado a partir da posicão 99? sendo que vai até 98.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Puxa!! Na ignorância da linguagem C, eu fiz combinações desses detalhes. Mas foi mais instrutivo perguntar.

Valeu cara!


Cara! Me precipitei. Entrada:

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

int main(void) {
    int i;
    char string[99];
    char *pst = &string[99];
    printf("String:\t");
    scanf("%[^\n]s",string);
    for(i = 0; pst[i]!='\0'; i++);
    printf("%d",i);
    return(0);
}

Compilação:

14:54:07 **** Incremental Build of configuration Debug for project project_scoop ****

make all
Building file: ../src/project_scoop.c
Invoking: Cross GCC Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/project_scoop.d"
-MT"src/project_scoop.d" -o "src/project_scoop.o" "../src/project_scoop.c"
Finished building: ../src/project_scoop.c
 
Building target: project_scoop
Invoking: Cross GCC Linker
gcc  -o "project_scoop"  ./src/project_scoop.o   
Finished building target: project_scoop

14:54:07 **** Build Finished (took 110ms)

Execução:

String:    string digitada
0

Tá valendo


Não era para dar zero, né?


Fiz

char *pst = &string[0];

e deu certo

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou te mostrar os erros que tem no seu código, mas peço que façassa!

 

 

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

int main(void) {
    int i;
    char string[99];
    char *pst = &string[99]; // Aqui vc está fazendo o ponteiro apontar para uma posição que não existe (a ultima posição é 98)
    printf("String:\t");
    scanf("%[^\n]s",string);
    for(i = 0; pst[i]!='\0'; i++);    // voce colocou um "ponto e virgula" no FOR, tire-o daí. o FOR nem ta rodando
    printf("%d",i); // Você está exibindo o valor de i ....
    return(0);
}

 

Vc colocou um ponto e virgula no final do for, então o I valor 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

TalissonBento,

muito obrigado pela atenção, é como uma carona para outra cidade quando estou indo a pé.

 

Mas o for não leva ponto e vírgula nem quando não tem bloco de código??

E eu não especifiquei, mas o for dá o comprimento da string digitada no valor de i...

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser pegar o comprimento da string utilize .size()

 

 

string nome = "talisson";
 
cout << nome.size();  // 8

 

 

Quando o FOR é utilizado sem chave ele apenas reconhece a primeira linha depois de sua declaração como seu escopo;

 

Assim também acontece com o IF e WHILE

 

Exemplo

  for(int i=0, i<10;++i)
       cout << "Estou exibindo: " << i << endl;
 cout<<"Acabei de sair do FOR e vou fazer outra coisa..."<<endl;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.