堆栈溢出变量“nom”

时间:2014-03-04 14:03:14

标签: c++

你好我在CONV函数中写入第二个FOR之后得到了这个错误,每个FORs都可以正常工作但是由于某些原因我把两个都放在函数内时会出现溢出。请帮忙。

#pragma warning(disable: 4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct nodo{
    char dato[100];
    struct nodo *sig;
}*pun;
typedef struct nodos{
    char nom[50];
    int num[20];
    struct nodos *sig;
}*puns;

void cargar(pun &top,pun &fin);
void mostrar(pun &top);
void conv(pun &top,pun &fin,puns &tops,puns &fins);
int main(){
    pun top=NULL,fin=NULL;
    puns tops=NULL,fins=NULL;
    cargar(top,fin);
    conv(top,fin,tops,fins);
    mostrar(top);
}

void cargar(pun &top,pun &fin){
    FILE *arch;
    pun aux=NULL;
    arch=fopen("nombres.txt","rt");
    if(arch==NULL){
        printf("No se puede abrir el archivo \n");
    }else{
        while(!feof(arch)){
            if(top==NULL){
                top=(nodo *)malloc(sizeof(nodo));
            fgets(top->dato,100,arch);
                        fin=top;
            }else{
                 aux=(nodo *)malloc(sizeof(nodo));
             fgets(aux->dato,100,arch);
             fin->sig=aux;
             fin=aux;
            }
        }
        fin->sig=NULL;
    }

}

void mostrar(pun &top){
    pun aux=top;
    while(aux!=NULL){
        puts(aux->dato);
        aux=aux->sig;
    }
}

void conv(pun &top,pun &fin,puns &tops,puns &fins){
    pun aux=top;
    puns auxs=tops;
    char nom[50],num[50],*p;
    int i,j=0,a;
    while(aux!=NULL){
        p=strchr(aux->dato,' ');
        for(i=0;i<p-aux->dato+1;i++){
             nom[i]=aux->dato[i];
        }
        nom[i]='\0';
        for(i;i<50;i++){
            num[j]=aux->dato[i];
            j++;
        }
        num[j]='\0';
        aux=aux->sig;
    }
}

1 个答案:

答案 0 :(得分:2)

您只需启动j一次。然后在for循环内多次执行此while循环。

for(i;i<50;i++){
    num[j]=aux->dato[i];
    j++;
}

第一次执行时,该循环很好。对于while循环的后续迭代,j不在num的末尾。

事实上,当您第一次执行num[j]='\0'时,j50,因此您将访问num的末尾。

我真的不知道你的代码想要实现什么,所以无法提出解决方案。显然,您需要避免在num的有效范围之外访问。