#include<stdio.h>
int main ()
{
int *ip;
printf("Enter a no \n");
scanf("%d",ip);
printf("ip=%d",*ip);
}
Run Code Online (Sandbox Code Playgroud)
以上是我的程序,当我运行它时输出
./a.out
Enter a no
10
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我在gdb第6行检查了问题是什么
scanf("%d",ip);
所以我推断这ip是一个指向整数的指针并%d期望一个地址值.虽然我试图将一个整数传递给指定的值,ip所以我认为这是错误的.但在上述情况下,正确的做法是什么.我想使用扫描并为指向的地址分配一个整数值ip(在我的情况下,这是丢失的).
David Heffernan的解决方案是正确的.但是,如果要使用指针(了解指针的工作原理),则必须使用"malloc"手动分配变量.
#include <stdio.h>
#include <stdlib.h> /* for malloc and free */
int main (void)
{
int *ip = malloc(sizeof(int)); /* declare and allocate a new int pointer */
printf("Enter a no \n");
scanf("%d", ip);
printf("ip = %d", *ip);
free(ip); /* free the memory */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
malloc()和free()位于stdlib.h中.当你声明:
int *ip;
Run Code Online (Sandbox Code Playgroud)
你只需要指定一个指向"无"的指针.所以你必须用malloc()分配必要的内存.之后,*ip指向新的内存位置,ip是新内存位置的地址.
当您不再需要带free()的变量时,必须手动释放内存.
您尚未分配任何存储空间,仅分配了一个指针。指针需要指向一些东西。您应该这样做:
#include <stdio.h>
int main(void)
{
int i;
printf("Enter a no \n");
scanf("%d", &i);
printf("i=%d", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我还自由地声明main()有效,并返回一个值。
如果您想了解指针,请尝试如下操作:
#include <stdio.h>
int main(void)
{
int i;
int* ip;
ip = &i;
printf("Enter a no \n");
scanf("%d", ip);
printf("*ip=%d", *ip);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您要堆分配而不是堆栈分配:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* ip;
ip = malloc(sizeof(int));
printf("Enter a no \n");
scanf("%d", ip);
printf("*ip=%d", *ip);
free(ip);
return 0;
}
Run Code Online (Sandbox Code Playgroud)