【发布时间】:2014-08-28 16:26:45
【问题描述】:
我试图在 C 中创建队列(作为一个类项目)。他们提供的演示代码适用于 Borland Turbo C。我正在尝试通过gcc 重建程序。虽然代码在 Turbo C 中完美运行,但它在运行时以 Segmentation Fault (core dumped) 的形式在 gcc 中抛出错误。
我没有包含不必要的代码部分。逐行尝试和测试。
struct node {
int data;
struct node *link;
};
struct queue {
struct node *front;
struct node *rear;
};
void initQ(struct queue *q) {
q->front = q->rear = NULL; // Error : Segmentation Fault! (core dumped)
}
void main() {
struct queue *Q;
initQ(Q);
}
我确定问题与编译器中的 C 版本有关。由于 Turbo C 非常古老,它不支持最新的修复。我在代码的其他各个部分遇到类似的Segmentation Fault 错误,例如:
void displayQ(struct queue *q) {
struct node *temp;
temp->link = q->front; // Error : Segmentation Fault! (core dumped)
}
问题 1:为什么 gcc 会给出这样的运行时错误? (在此代码中)
问题 2:为什么代码在 Turbo C 中可以正常工作,但在 gcc 中不行?
问题 3:这种编程风格是否有替代方案?
【问题讨论】:
-
广告问题 2:代码在每个版本的 C 中都是无效的,检查为什么它似乎与 Turbo C 一起工作将取决于其他几个信息。例如。平台。另请注意,它可能似乎适用于小队列,但对于较大的输入会失败,或者如果再次运行可能会立即失败,依此类推。看来,
Q恰好包含一些可以取消引用的随机值(它指向的内容以及您可能覆盖的其他数据是另一回事)。另请注意,使用 Gcc 编译时它似乎也可以工作。