C指针问题,取消引用崩溃

标签 c pointers

为什么这样做?

    int *var;

while(scanf("%d", &var) && *var != 0)
        printf("%d \n", var);

虽然这不是?

    int *var;

while(scanf("%d", &var) && var != 0)
    printf("%d \n", var);

*(解引用运算符)不是给你指针指向的值吗?那为什么 *var != 0 会使程序崩溃,而 var != 0 不会?


这有效:

int* var = malloc(sizeof(int));

while(scanf("%d", var) && *var != 0)
    printf("%d \n", *var);

正在学习 C 语言的进修类(class),很高兴我做到了。

我意识到 scanf(&var) 用于常规变量,而 scanf(var) 用于指针。但是完全忘记了内存,谢谢!

最佳答案

我不确定您所说的“有效”是什么意思,但第一个是错误的,因为在第一个示例中您使用 var 指向的内容并将其与零进行比较,并且由于 var 已被初始化为用户的内容输入时,var 指向的地方不太可能是有效位置。

*var != 0

这采用用户定义的 var 指向的值。

请注意,在 scanf 中,您正在扫描一个整数到 int **,而不是 int *,并且 printf 使用 %d 打印一个指针,而不是一个整数。

当您出于各种原因执行未定义的事情时,事情可能看起来有效或失败。您应该理解为什么您正在编写的代码是正确的,而不是写下一些代码并对其进行更改直到它起作用。

关于C指针问题,取消引用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893675/

相关文章:

c - 在 C 中使用带指针的结构和数组

c++ - `std::shared_ptr` 的智能指针模拟,带有用于将回调绑定(bind)到引用计数修改事件的 API,例如释放/保留……这是一回事吗?

c - 指针算术在数组外是否仍然有效?

c - 如何在访问数组和二维数组时通过 c 中的 malloc 分配最大长度?

c++ - 两个单独的指针可以引用同一个地址吗?如果是这样,我可以用任一指针更改该地址的值吗?

c++ - 链接 MySQL C 连接器?

c - 内存访问冲突。这个看似简单的程序有什么问题?

c++ - GNU 的 nana 库死了吗?是否有后继者在使用?

c - C 中箭头运算符 (->) 的用法

C 字符串取消引用然后重新引用行为奇怪吗?