如何使用 realloc(奇怪的行为)
How to use realloc (strange behavior)
所以我有一个程序并且它工作正常。
#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,程序崩溃并显示消息“`./t' 中的错误:realloc():下一个大小无效: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 也会打印消息 'Invalid write of size 8'。
我做错了什么?
我使用 gcc 和 Debian Jessie x86_64.
您将错误的尺寸传递给 realloc
。因此,您的程序会立即遇到未定义的行为。
使用:
st->arr = realloc(st->arr, sizeof(*st->arr)*st->maxsize);
所以我有一个程序并且它工作正常。
#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,程序崩溃并显示消息“`./t' 中的错误:realloc():下一个大小无效: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 也会打印消息 'Invalid write of size 8'。 我做错了什么? 我使用 gcc 和 Debian Jessie x86_64.
您将错误的尺寸传递给 realloc
。因此,您的程序会立即遇到未定义的行为。
使用:
st->arr = realloc(st->arr, sizeof(*st->arr)*st->maxsize);