gpt4 book ai didi

c - 如何使用 realloc (奇怪的行为)

转载 作者:行者123 更新时间:2023-11-30 15:05:10 26 4
gpt4 key购买 nike

所以我有一个程序并且它工作得很好。

#include <stdio.h>
#include <stdlib.h>
#define STACKDEFSIZE 1
typedef struct
{
unsigned long int maxsize;
unsigned long int cursize;
unsigned long int* arr;
} stack;

stack* create_stack()
{
stack* res = (stack*)malloc(sizeof(stack));
res->arr = malloc(sizeof(long) * STACKDEFSIZE);
res->maxsize = STACKDEFSIZE;
res->cursize = 0;
return res;
}

void push(stack* st, int val)
{
if (st->cursize == st->maxsize)
{
unsigned long int* old = st->arr;
st->maxsize *= 2;
st->arr = malloc(sizeof(unsigned long int) * st->maxsize);
int i;
for(i = 0; i < st->cursize; i++)
st->arr[i] = old[i];
free(old);
}
st->arr[st->cursize] = val;
st->cursize += 1;
}

int main() {
stack* s = create_stack();
int i;
for(i = 0; i < 10000; i++)
{
push(s, i);
}
return 0;
}

但是,如果我将函数“push”更改为使用 realloc 而不是 malloc 和 free,则程序崩溃并显示消息“Error in `./t': realloc(): invalid next size: 0x0000000001031030已中止”

void push(stack* st, int val)    
{
if (st->cursize == st->maxsize)
{
st->maxsize *= 2;
st->arr = realloc(st->arr, st->maxsize);
}
st->arr[st->cursize] = val;
st->cursize += 1;
}

当我尝试使用 realloc 时,valgrind 还会打印消息“大小 8 的写入无效”。我做错了什么?我使用 gcc 和 Debian Jessie x86_64。

最佳答案

您向 realloc 传递了错误的大小。因此,您的程序很快就会遇到未定义的行为。

用途:

st->arr = realloc(st->arr, sizeof(*st->arr)*st->maxsize);

关于c - 如何使用 realloc (奇怪的行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39990966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com