C 序列堆栈:未初始化的值是由堆分配创建的

C 序列堆栈:未初始化的值是由堆分配创建的,c,memory-management,malloc,C,Memory Management,Malloc,刚才我用c编写了一个简单的数据结构序列堆栈,遇到了一个问题 ==8142== Use of uninitialised value of size 4 ==8142== at 0x408F4AB: _itoa_word (_itoa.c:195) ==8142== by 0x40935EA: vfprintf (vfprintf.c:1629) ==8142== by 0x4099EFE: printf (printf.c:35) ==8142== by 0x40664D

刚才我用c编写了一个简单的数据结构序列堆栈,遇到了一个问题

==8142== Use of uninitialised value of size 4
==8142==    at 0x408F4AB: _itoa_word (_itoa.c:195)
==8142==    by 0x40935EA: vfprintf (vfprintf.c:1629)
==8142==    by 0x4099EFE: printf (printf.c:35)
==8142==    by 0x40664D2: (below main) (libc-start.c:226)
==8142==  Uninitialised value was created by a heap allocation
==8142==    at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==8142==    by 0x80484C9: sqstack_create (sqstack.c:24)
==8142==    by 0x80485D8: main (sqstack.c:84)
==8142== 
==8142== Conditional jump or move depends on uninitialised value(s)
==8142==    at 0x408F4B3: _itoa_word (_itoa.c:195)
==8142==    by 0x40935EA: vfprintf (vfprintf.c:1629)
==8142==    by 0x4099EFE: printf (printf.c:35)
==8142==    by 0x40664D2: (below main) (libc-start.c:226)
==8142==  Uninitialised value was created by a heap allocation
==8142==    at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==8142==    by 0x80484C9: sqstack_create (sqstack.c:24)
==8142==    by 0x80485D8: main (sqstack.c:84)
结果显示,第24行可能会出现错误:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "status.h"

#define MAX_SIZE 10

typedef int ElemType;

typedef struct{
    ElemType *base;
    ElemType *top;
    int      size;
} sqstack_t;


sqstack_t *sqstack_create(){

    sqstack_t *s = (sqstack_t *)malloc(sizeof(sqstack_t));
    if (s == NULL) {
        return ERROR;
    }

    //this line  24
    s->base = (ElemType *)malloc(sizeof(ElemType)*MAX_SIZE);
    if (s->base == NULL) {
        return ERROR;
    }

    s->top = s->base;
    s->size = 0;

    return s;
}

Status sqstack_push(sqstack_t *s, ElemType data){

    if (s->size > MAX_SIZE) {
        printf("This stack is full!\n");
        return ERROR;
    }

    *s->top++ = data;
    s->size += 1;

    return OK;
}


ElemType sqstack_pop(sqstack_t *s){

    if (s->size == 0) {
        printf("This stack is empty!\n");
    return ERROR;
    }

    ElemType data;

    data = *s->top--;
    s->size -= 1;

    return data;
}


ElemType sqstack_top(sqstack_t *s){

    return *(s->top);
}


void sqstack_destroy(sqstack_t *s){

    s->top = NULL;
    free(s->base);
    free(s);
}

int main(void){

    sqstack_t *s;

    s = sqstack_create();

    sqstack_push(s, 10);
    sqstack_push(s, 20);
    sqstack_push(s, 30);
    sqstack_push(s, 40);

    printf("%d\n", sqstack_pop(s));
    printf("-%d-\n", sqstack_top(s));

    sqstack_destroy(s);

    return 0;
}
#包括
#包括
#包括
#包括“status.h”
#定义最大尺寸10
typedef int ElemType;
类型定义结构{
ElemType*base;
ElemType*top;
整数大小;
}SQU t;
sqstack_t*sqstack_create(){
sqstack_t*s=(sqstack_t*)malloc(sizeof(sqstack_t));
如果(s==NULL){
返回误差;
}
//这是第24行
s->base=(ElemType*)malloc(sizeof(ElemType)*MAX_SIZE);
如果(s->base==NULL){
返回误差;
}
s->top=s->base;
s->size=0;
返回s;
}
状态sqstack_push(sqstack_t*s,元素类型数据){
如果(s->尺寸>最大尺寸){
printf(“此堆栈已满!\n”);
返回误差;
}
*s->top++=数据;
s->size+=1;
返回OK;
}
元素类型sqstack\u pop(sqstack\u t*s){
如果(s->size==0){
printf(“此堆栈为空!\n”);
返回误差;
}
元素类型数据;
数据=*s->top--;
s->size-=1;
返回数据;
}
元素类型sqstack_top(sqstack_t*s){
返回*(s->top);
}
无效sqstack_销毁(sqstack_t*s){
s->top=NULL;
免费(s->base);
免费的;
}
内部主(空){
SQU t*s;
s=sqstack_create();
SQU推力(s,10);
SQU推力(s,20);
SQU推力(s,30);
SQU推力(s,40);
printf(“%d\n”,sqstack_pop);
printf(“-%d-\n”,SQU顶部);
SQU销毁;
返回0;
}
我不知道怎么修理它。我是C语言新手,经常被内存分配和内存泄漏弄糊涂。你能给我推荐一些好的材料或书籍吗


谢谢

使用此行
s->base=(ElemType*)malloc(sizeof(ElemType)*MAX_SIZE)您正在分配内存,但内存未初始化,并且具有随机值。所以访问
s->base->somefield
将产生随机值

最好将其初始化为

memset(s->base, 0, sizeof(*(s->base)));
或者使用
calloc

s->base = (ElemType *)calloc(sizeof(ElemType)*MAX_SIZE, 1);

s->base
是指向
ElemType
元素的size
MAX\u size
数组的指针。这些
elemType
未初始化。在此指针上执行memset,最多执行
MAX\u SIZE
次。

请问
MAX\u SIZE
的值是多少?您的代码没有显示实际问题,这似乎是由于调用
printf()
某个地方造成的?感谢您对指针转换的建议!因为一些像C上的指针这样的书就是这么做的,我只是学着去做。从现在开始,我纠正了错误的代码风格。特别是,行
s->top=s->base
malloc()
向下几行将
s->base
的未初始化值复制到
s->top
中。也许该行应该是
s->top=s->base=NULL
calloc()
有效!以前我只知道
malloc()。现在我明白了。谢谢