Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';s_itoa导致我的程序崩溃?_C - Fatal编程技术网

C 为什么';s_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

下面的代码在到达带有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);

}
#包括“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>强制转换。