0

我正在尝试创建一个方法 ( proc),以保证在取消引用未初始化的指针时交换将崩溃。

我想要的是,当没有分配内存时,程序崩溃。

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

void swap (int *px, int *py) {
    int *temp;
    *temp = *px; // Why doesn't this crash?
    *px = *py;
    *py = *temp;
}


int main() {
    int a = 99999;
    int b = -0;
    int c = 0;
    //proc(/* Some args might go here */);
    swap(&a, &b);
    printf("%d\n", a);
    printf("%d\n", b);
}
4

1 回答 1

0

该变量temp是在堆栈上分配的,因此当您的程序运行时它可能已经包含一些有效的指针*temp = *px;。在这种情况下,即使您没有初始化程序也不会崩溃。您可以使用 gdb 对其进行调试,在此行中断并键入p temp以查看存储在其中的值。

但是,如果您真的希望程序崩溃。尝试以下一种:

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

void swap (int *px, int *py) {
    int *temp;
    *temp = *px; // Why doesn't this crash?
    *px = *py;
    *py = *temp;
}

void proc(int *px, int *py) {
    int *temp = 0;
    printf("temp = %p\n", temp);
}

int main() {
    int a = 99999;
    int b = -0;
    int c = 0;
    proc(&a, &b);
    swap(&a, &b);
    printf("%d\n", a);
    printf("%d\n", b);
}

proc函数应具有与 完全相同的堆栈布局swap。所以它应该temp在程序调用之前清除指针swap,这可能会导致该行的交换崩溃。

但是,您可能需要禁用优化才能使其正常工作。

于 2013-05-27T04:26:20.587 回答