0

这是代码:

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

void foo(int* ptr) {
    printf("ptr is %x\n", ptr);
}

void main() {
    int* ptr = (int*)malloc(sizeof(int));
    printf("ptr is %x\n", ptr);
    foo(ptr);
    free(ptr);
}

...他是输出:

ptr is 0x007446c0
ptr is 0x00000000

...问题
是:为什么这会发生在我身上???

4

2 回答 2

3

发生这种情况是因为%xinprintf需要一个无符号整数,而不是指针。

以下是如何修复您的程序以获得您想要的行为:

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

void foo(int* ptr) {
    printf("ptr is %p\n", (void*)ptr);
}

int main() {
    int* ptr = malloc(sizeof(int));
    printf("ptr is %p\n", (void*)ptr);
    foo(ptr);
    free(ptr);
    return 0;
}

这是ideone 的链接;运行产生预期结果:

ptr is 0x8fa3008
ptr is 0x8fa3008
于 2013-03-22T13:07:57.090 回答
1

因为你的程序调用了未定义的行为,我想。这就是我认为你的意思:

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

void foo(int* ptr) {
    printf("ptr is %p\n", (void *) ptr); /* %x tells printf to expect an unsigned int. ptr is not an unsigned int. %p tells printf to expect a void *, which looks a little better, yeh? */
}

int main() { /* main ALWAYS returns int... ALWAYS! */
    int* ptr = malloc(sizeof(int)); /* There is no need to cast malloc. Stop using a C++ compiler to compile C. */
    printf("ptr is %p\n", (void *) ptr);
    foo(ptr);
    free(ptr);
}

这能解决你的问题吗?

于 2013-03-22T13:08:02.360 回答