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

标签 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,崩溃显示如下: “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/

相关文章:

C : Static to dynamic allocation on multiple dimension array

使用内置 SDL2 库从 c 项目创建 .exe

c - 从文件 fgetc 读取的性能与 fread 整个字符串的性能

使用 C 清除类似于手册页的终端

c - Stacksmashing 甚至没有访问任何数据

c - C 如何处理本地字符串文字的内存?

c - 将动态大小的可变长度数组 (VLA) 初始化为 0

c - 将二维动态行分配给一维数组

c - 初始化 Apache 服务器中的全局变量

C 中结构体链表转换为 FIFO