C 为什么';s_itoa导致我的程序崩溃?
下面的代码在到达带有itoa的部分时不断崩溃,我尝试实现该函数,但它变得更奇怪,当我在没有调试器的情况下运行它时,它不断崩溃,但在使用调试器时工作正常C 为什么';s_itoa导致我的程序崩溃?,c,C,下面的代码在到达带有itoa的部分时不断崩溃,我尝试实现该函数,但它变得更奇怪,当我在没有调试器的情况下运行它时,它不断崩溃,但在使用调试器时工作正常 # include "HNum.h" # include <stdio.h> # include <stdlib.h> # include <string.h> # include <assert.h> # define START_value 30 typedef enum { HN
# 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);
}
#包括“HNum.h”
#包括
#包括
#包括
#包括
#定义起始值30
类型定义枚举{
HNUM_OUT_OF_MEMORY=-1,
HNUM_SUCCESS=0,
}HNumRetVal;
类型定义结构{
大小\u t大小\u内存;
字符*字符串;
}HNum;
HNum*HNum_alloc(){
HNum*first=(HNum*)malloc(sizeof(HNum));
if(first==NULL){
返回NULL;
}
第一个->字符串=(char*)malloc(sizeof(START_值));
如果(第一个->字符串==NULL){
返回NULL;
}
first->Size\u Memory=START\u value;//斜杠零和从零索引开始;
先返回;
}
HNumRetVal HNum_setFromInt(HNum*HNum,int nn){
itoa(nn,hnum->String,10);
}
void main(){
HNum*nadav;
int h=13428637;
nadav=HNum_alloc();
nadav->String=“1237823434”;
HNum_setFromInt(nadav,h);
printf(“nadav字符串:%s\n”,nadav->string);
//printf(“w字符串%s\n”,w->string);
//printf(“nadav字符串%s\n”,nadav->string);
无HNum_(nadav);
}
我已经想了好几个小时了,但什么都想不出来。。。
我使用的IDE是Visual Studio 2012 express,崩溃显示如下:
“PROJECT C.exe已停止工作
windows可以联机检查该程序的解决方案。”
应该是
first->String = malloc(START_value);
当前版本为sizeof(int)-1
字符分配空间(-1)为nul终止符留出空间。这太小,无法保存目标值,因此\u itoa
写入的内容超出了为first->String
分配的内存。这会导致未定义的行为;很可能不同的运行在不同的位置失败,或者调试/发布版本的行为不同
您还需要删除该行
nadav->String="1237823423423434";
它泄漏了为HNum_alloc
中的String
分配的内存,并将其替换为指向字符串文本的指针。这个新指针应该被认为是只读的;您不能将其写在\u itoa
应该是
first->String = malloc(START_value);
当前版本为sizeof(int)-1
字符分配空间(-1)为nul终止符留出空间。这太小,无法保存目标值,因此\u itoa
写入的内容超出了为first->String
分配的内存。这会导致未定义的行为;很可能不同的运行在不同的位置失败,或者调试/发布版本的行为不同
您还需要删除该行
nadav->String="1237823423423434";
它泄漏了为
HNum_alloc
中的String
分配的内存,并将其替换为指向字符串文本的指针。这个新指针应该被认为是只读的;你不能把它写在itoa里面,因为我不允许评论:
西蒙克的回答是正确的。如果你觉得以下答案有用,你应该把他的答案记为正确答案:P
我自己也试过了,唯一缺少的是:
strcpy(nadav->String,“1237823434”)代码>而不是nadav->String=“1237823434”代码>
及
first->String=malloc(起始值)代码>而不是first->String=(char*)malloc(sizeof(START_值))代码>
此外,也许你必须使用\u itoa
而不是itoa
,这是我无论如何都必须改变的事情之一
如果这不起作用,你可能应该考虑使用不同版本的
>P>因为我不允许发表评论:
西蒙克的回答是正确的。如果你觉得以下答案有用,你应该把他的答案记为正确答案:P
我自己也试过了,唯一缺少的是:
strcpy(nadav->String,“1237823434”)代码>而不是nadav->String=“1237823434”代码>
及
first->String=malloc(起始值)代码>而不是first->String=(char*)malloc(sizeof(START_值))代码>
此外,也许你必须使用\u itoa
而不是itoa
,这是我无论如何都必须改变的事情之一
如果这不起作用,你可能应该考虑使用不同版本的vs. /p>c——“string”文字是常数。用调试器运行它,后者会告诉你它在哪里崩溃。那么告诉我们。@alk代码中有两个错误。您链接到的帖子很好地涵盖了其中一个问题,但对另一个(
sizeof
)问题没有帮助。当然,问题是为什么它在itoa()
中崩溃@simoncC-“字符串”文本是常量。使用调试器运行它,调试器将告诉您它崩溃的确切位置。那么告诉我们。@alk代码中有两个错误。您链接到的帖子很好地涵盖了其中一个问题,但对另一个(sizeof
)问题没有帮助。当然,问题是为什么它在itoa()
中崩溃@simoncI尝试用50初始化字符串,但它仍然会崩溃,关于更改您提到的那行代码,我想这确实是正确的编写方法,但我的代码在没有它的情况下仍然可以工作,对吗?您需要进行我提到的两项更改。如果没有它们,代码将无法可靠地工作。它不允许我这样编写“first->String=malloc(START_value);”表示“错误:不能将类型为“void*”的值分配给类型为“char*”的实体,并将nadav->String=“1237823434”更改为strcpy(nadav->String,“1237823434”)使程序在Strucy线上崩溃,就像在C项目上使用C++编译器一样。如果使用C编译器,则不需要强制转换。如果要继续使用,则需要恢复<代码>(char)< /Case>强制转换。