我正在尝试用C写一个代码,但是我在realloc上遇到了一些问题。我不得不写一个代码,它将创建一个堆栈,并将添加到它(dodaj_do_stosu),从它移除(usun_ze_stosu),并将查看该堆栈上的顶部内容。我在编译时遇到了问题(它确实对前两个单词有效,但随后返回(0xC0000374))。
我想我用错了realloc和我的结构的大小。如果有人能看看我的代码(特别是函数(dodaj_do_stosu)),告诉我我做错了什么thx。我的代码看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
int n;
char *nazwa;
}element_t;
typedef struct {
int rozmiar;
element_t **tablica;
}stos_t;
void top_of_stack(stos_t *s){
printf("ostatni element stosu:rozmiar = %d nazwa=%s, n=%d\n", s->rozmiar, s->tablica[s->rozmiar]->nazwa, s->tablica[s->rozmiar]->n);
}
void init(stos_t *s)
{
s->rozmiar=0;
s->tablica=malloc(0);
}
void dodaj_do_stosu(stos_t *s, int n, char *name)
{
s->tablica = realloc(s->tablica, (s->rozmiar + 1) * sizeof(s->tablica));
s->tablica[s->rozmiar]->nazwa = name;
s->tablica[s->rozmiar]->n = n;
printf("rozmiar=%d, n=%d , nazwa=%s\n",s->rozmiar, s->tablica[s->rozmiar]->n, s->tablica[s->rozmiar]->nazwa);
s->rozmiar++;
}
void usun_ze_stosu(stos_t *s)
{
s->tablica = realloc(s->tablica, (s->rozmiar - 1) * sizeof(s->tablica[0]));
s->rozmiar--;
}
void rm(stos_t s)
{
free(s.tablica);
}
int main(int argc, char **argv)
{
stos_t s;
init(&s);
int i;
srand(time(0));
if (argc>1)
for(i=1;i<argc;i++){
printf("%s\n", argv[i]);
dodaj_do_stosu(&s, rand() % 10, argv[i]);
}
for(i=0;i<argc-1;i++){
//printf("i=%d, n=%d, nazwa=%s\n",i, s.tablica[i].n, s.tablica[i].nazwa);
}
//top_of_stack(&s);
//usun_ze_stosu(&s);
//top_of_stack(&s);
rm(s);
return 0;
}
2条答案
按热度按时间mtb9vblg1#
问题的一个重要方面是
tablica
是一个 pointers 数组,但您从未初始化指针本身。dodaj_do_stosu
函数重新分配数组,但不创建element_t
对象。因此,任何对s->tablica[s->rozmiar]
的解引用都将导致 undefined behavior。有两种可能的解决方案:
1.分配新的
element_t
结构:在初始化
element_t
结构成员之前。1.使
tablica
成为结构 * 对象 * 的数组,而不是指针:我推荐解决方案2。
ecbunoof2#
至少函数
dodaj_do_stosu
是错误的。数据成员tablica
声明如下因此,表达式
s->tablica[s->rozmiar]
具有类型element_t *
和一个不确定的值。调用未定义的行为。
必须为
element_t
结构类型的对象分配内存,而不是为element_t *
类型的指针分配内存。因此,您需要声明数据成员,如下所示
并在函数中写入
此外,对于
realloc
的调用,使用中间指针更为安全。该函数可以如下所示
因此,函数至少应该按照以下方式重新定义。例如,当
s->rozmiar
等于0时,它可以调用未定义的行为。同样在函数
init
中,如果编写另一个问题是函数
rm
你应该通过一个指针把原始对象传递给它,并在函数内写