#include<stdio.h>
int main ()
{
int *ip;
printf("Enter a no \n");
scanf("%d",ip);
printf("ip=%d",*ip);
}
以上是我的程序,当我运行它时,输出
./a.out
Enter a no
10
Segmentation fault
我检查了gdb第6行是
的问题 scanf("%d",ip);
所以我推断ip
是指向整数的指针,%d
指的是地址值。
虽然我试图将整数传递给ip
指定的值,所以我认为这是错误的。但在上述情况下,正确的做法是什么。我想使用scan并为ip
指向的地址分配一个整数值(在我的情况下,这个地址丢失了)。
答案 0 :(得分:6)
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;
}
malloc()和free()位于stdlib.h中。当你声明:
int *ip;
您只需分配一个指向“无”的指针。所以你必须用malloc()分配必要的内存。之后,* ip指向新的内存位置,ip是新内存位置的地址。
当您不再需要带free()的变量时,必须手动释放内存。
答案 1 :(得分:5)
您尚未分配任何存储空间,仅指定了指针。指针需要指向的东西。你应该这样做:
#include <stdio.h>
int main(void)
{
int i;
printf("Enter a no \n");
scanf("%d", &i);
printf("i=%d", i);
return 0;
}
我还冒昧地使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;
}
或者如果你想要堆分配而不是堆栈分配:
#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;
}
答案 2 :(得分:2)
这是修复它的一种方法:
#include<stdio.h>
int main () {
int i;
printf("Enter a no \n");
scanf("%d", &i);
printf("i=%d", i);
}
另一种方式是:
#include<stdio.h>
int main () {
int* ip = malloc(sizeof int);
printf("Enter a no \n");
scanf("%d", ip);
printf("ip=%d", *ip);
}
原始问题是int* ip;
只是声明指向整数的指针,但没有分配任何内存来保存实际的整数,或者将指针设置为指向任何有意义的东西。您只是获得指向某个随机内存位置的指针,该位置可能是您的程序可以寻址的,也可能是不可寻址的。因此,当scanf()
尝试取消引用此指针以向其写入数据时,会出现分段错误。
答案 3 :(得分:1)
您需要为该指针分配内存。
int *ip = malloc(sizeof(int));
// do stuff with ip
free(ip); //free the memory allocated
答案 4 :(得分:1)
你应该分配内存。
int* ip = malloc(sizeof(int));
scanf("%d", ip);
...
free(ip)
或者,只需传递堆栈变量的地址
int i;
scanf(%d, &i);
答案 5 :(得分:1)
不,你错了,ip不是整数指针。 ip的类型是整数指针,即你分配给ip的应该是一个整数指针。但你没有给ip分配任何东西。那么你期望scanf存储整数值?