以下代码在到达带有 _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,崩溃显示如下: “PROJECT C.exe 已停止工作 windows可以在线查询该程序的解决方案。”
最佳答案
first->String =(char*)malloc(sizeof(START_value));
应该是
first->String = malloc(START_value);
当前版本为 sizeof(int)-1
个字符分配空间(-1 为 nul 终止符留出空间)。这太小了,无法容纳您的目标值,因此 _itoa
写入超出分配给 first->String
的内存。这会导致未定义的行为;不同的运行很可能在不同的地方失败,或者调试/发布版本的行为不同。
您还需要删除该行
nadav->String="1237823423423434";
它泄漏了在 HNum_alloc
中为 String
分配的内存,将其替换为指向字符串文字的指针。这个新指针应该被认为是只读的;你不能把它写在 _itoa
关于c - 为什么 _itoa 导致我的程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738486/