为什么_itoa会导致我的程序崩溃?

时间:2014-05-19 13:01:25

标签: c

以下代码在到达带有_itoa的部分时会继续崩溃,我尝试实现该功能,然后它甚至变得更奇怪了,当我在没有调试器的情况下运行它时它仍然会崩溃使用调试器时很好。

# include "HNum.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <assert.h>
# define  START_value 30


typedef enum {
    HNUM_OUT_OF_MEMORY = -1,
    HNUM_SUCCESS = 0,
} HNumRetVal;

typedef struct _HNum{
    size_t Size_Memory; 
    char* String;
}HNum;

HNum *HNum_alloc(){
    HNum* first = (HNum*)malloc(sizeof(HNum));
    if(first==NULL){
        return NULL;
    }
    first->String =(char*)malloc(sizeof(START_value));
    if(first->String==NULL){
        return NULL;
    }
    first->Size_Memory = START_value; // slash zero && and starting from zero index;
    return first;
}

HNumRetVal HNum_setFromInt(HNum *hnum, int nn){
    itoa(nn,hnum->String,10);
}

void main(){
    HNum * nadav ;
    int h = 13428637;
    nadav = HNum_alloc();
    nadav->String="1237823423423434";
    HNum_setFromInt(nadav,h);
    printf("nadav string : %s \n ",nadav->String);
    //printf("w string %s\n",w->String);
    //printf("nadav string %s\n",nadav->String);
    HNum_free(nadav);

}

我一直在努力解决这个问题几个小时,无法想出任何事情...... 我使用的IDE是Visual Studio 2012 express,崩溃显示如下: &#34; PROJECT C.exe已停止工作 Windows可以在线查看该程序的解决方案。&#34;

2 个答案:

答案 0 :(得分:4)

first->String =(char*)malloc(sizeof(START_value));

应该是

first->String = malloc(START_value);

当前版本为sizeof(int)-1个字符分配空间(-1为nul终结符留出空间)。这太小而无法保持目标值,因此_itoa写入的内容超出为first->String分配的内存。这会导致不确定的行为;不同的运行很可能在不同的地方失败,或者调试/发布版本的行为不同。

您还需要删除

nadav->String="1237823423423434";

泄漏了String中为HNum_alloc分配的内存,将其替换为指向字符串文字的指针。这个新指针应该被认为是只读的;你不能把它写在_itoa

里面

答案 1 :(得分:0)

由于我不允许发表评论:

simonc 的回答是正确的。如果您发现以下答案有用,则应将其答案标记为正确答案:P 我自己尝试了这个代码,唯一缺少的是让我们说:

strcpy(nadav->String, "1237823423423434"); INSTEAD OF nadav->String="1237823423423434";

first->String = malloc(START_value); INSTEAD OF first->String =(char*)malloc(sizeof(START_value));

此外,也许您必须使用_itoa而不是itoa,这是我无论如何都必须改变的事情之一。

如果这不起作用,您应该考虑使用不同版本的VS。