gpt4 book ai didi

c - 为什么这段代码表现不一致?

转载 作者:行者123 更新时间:2023-12-01 15:54:42 26 4
gpt4 key购买 nike

我正在尝试实现 CS107 - 编程范式(斯坦福在线类(class))中第 5 讲和第 6 讲中说明的通用堆栈。以下代码代表讲座中展示的示例,可以编译,但似乎表现不一致,因为我经常遇到断言失败。

我注意到 Geany 和 gcc 中的行为 ($ gcc --version
gcc (Debian 6.3.0-18) 6.3.0 20170516
),但不在`https://www.tutorialspoint.com/compile_c_online.php上' 所以我想知道它是由 gcc 中的某些东西还是我现在似乎没有看到的错误引起的。

代码:

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

typedef struct {
void *elems;
int elemSize;
int logLen;
int allocLen;

} stack;

void StackNew(stack *s, int elemSize);
void StackDispose(stack *s);
void StackPush(stack *s, void *elemAddr);
void StackPop(stack *s, void * elemAddr);

void StackNew(stack *s, int elemSize)
{
assert(s->elemSize > 0);
s->elemSize = elemSize;
s->logLen = 0;
s->allocLen = 4;
s->elems = malloc(4 * elemSize);
assert(s->elems != NULL);
}

void StackDispose(stack *s)
{
free(s->elems);
}

static void StackGrow(stack *s)
{
s->allocLen *= 2;
s->elems = realloc(s->elems, s->allocLen * s->elemSize);
}

void StackPush(stack *s, void *elemAddr)
{
if(s->logLen == s->allocLen)
StackGrow(s);
void *target = (char *) s->elems + s->logLen * s->elemSize;
memcpy(target, elemAddr, s->elemSize);
s->logLen++;
}

void StackPop(stack *s, void *elemAddr)
{
void *source = (char *) s->elems +
(s->logLen - 1) * s->elemSize;
memcpy(elemAddr, source, s->elemSize);
s->logLen--;
}


int main(void)
{
const char *friends[] = {"Al", "Bob", "Carl"};

stack stringStack;
StackNew(&stringStack, sizeof(char *));
int i;
for (i = 0; i < 3; i++){
char *copy = strdup(friends[i]);
StackPush(&stringStack, &copy);
}

char *name;

for (i = 0; i < 3; i++) {
StackPop(&stringStack, &name);
printf("%s\n", name);
free(name);
}
StackDispose(&stringStack);
return 0;

}

没有任何源代码修改的几个连续执行的示例输出:

$ ./stack4
stack4: stack4.c:21: StackNew: Assertion 's->elemSize' > 0 failed.
Aborted
$ ./stack4
stack4: stack4.c:21: StackNew: Assertion 's->elemSize' > 0' failed.
Aborted
$ ./stack4
Carl
Bob
Al
$ ./stack4
Carl
Bob
Al
$ ./stack4
Carl
Bob
Al
$ ./stack4
stack4: stack4.c:21: StackNew: Assertion 's->elemSize' > 0' failed.
Aborted
$ ./stack4
stack4: stack4.c:21: StackNew: Assertion 's->elemSize' > 0 failed.
Aborted
$ ./stack4
Carl
Bob
Al
$ ./stack4
stack4: stack4.c:21: StackNew: Assertion 's->elemSize' > 0' failed.

最佳答案

在设置它之前,您正在检查 s->elemSize。您正在使用未初始化的变量。

修复:要么 assert(elemSize > 0)(检查函数参数,而不是 s 的成员),要么执行 asserts->elemSize = elemSize 赋值之后。

关于c - 为什么这段代码表现不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45460094/

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