c - 使用指针时的意外行为和编译器错误
问题描述
我是 C 新手,几个月来我一直在使用指针并试图弄清楚它们是如何工作的并学习使用它们的语法,但是当编译器抛出错误时我遇到了一个令人困惑的部分,
[1] 1473 segmentation fault (core dumped) ./a.out
但我认为代码语法是正确的。
由于我正在使用和学习动态数据结构,很多时候一切看起来都很好,但有时我会遇到一些奇怪的错误,所以我提供了这个使用指针的简单示例,这让我感到困惑。
#include <stdio.h>
int main ()
{
int *b;
printf ("Enter some int value -> ");
scanf ("%d", b);
printf ("Entered value is: %d", *b);
return 0;
}
我正在声明一个变量,它是指向内存中整数的指针。由于它在 scanf() 参数中的指针只是该变量的名称,并且当我将其打印到 stdout(printf()) 时,我使用 *b 因为指向指针的指针是该变量的实际值。
解决方案
*b
没有指向任何地方。尝试这个:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *b = malloc(sizeof(int)); // dynamically allocate memory
printf ("Enter some int value -> ");
scanf ("%d", b);
printf ("Entered value is: %d", *b);
free(b); // free the dynamically allocated memory
return 0;
}
或者通过指向堆栈上的变量而不是动态内存分配:
#include <stdio.h>
int main ()
{
int a;
int *b = &a;
printf ("Enter some int value -> ");
scanf ("%d", b);
printf ("Entered value is: %d", *b); // or have a instead of *b
return 0;
}
确保考虑编译器给您的警告。您的代码可能会触发有关使用未初始化的局部变量“b”的警告。如果您没有收到警告,请查看是否可以将编译器配置为更严格。
推荐阅读
- node.js - 在 IP 和端口上托管节点服务器
- c++ - rvalue、lvalues、xvalues、glvalues 和 prvalues 的示例?
- c# - 如何调试。记录自定义类
- c++ - Windows 应用商店应用程序 - 删除 fullTrustCapability
- php - 对于 php 后端中的每个结构,每张卡片都显示得越来越小。我该怎么办?
- django - 将多重模型与基于类的视图 Django 2.0 结合使用
- python-2.7 - Ansible 无法在 sbin 文件夹上运行 shell 模块
- c++ - C++20中对象的隐式创建,理解提案的类型双关语示例
- google-apps-script - 如果未每 1 小时收到来自预期发件人的电子邮件,则 Google Apps 脚本发送电子邮件通知
- ios - WhatsApp 如何绕过 APNS 限制以显示设备离线时收到的多条推送消息?