如何将值传递给整数指针

时间:2011-03-26 11:14:20

标签: c

#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指向的地址分配一个整数值(在我的情况下,这个地址丢失了)。

6 个答案:

答案 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

更多:http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

答案 4 :(得分:1)

你应该分配内存。

int* ip = malloc(sizeof(int));
scanf("%d", ip);
... 
free(ip)

或者,只需传递堆栈变量的地址

int i; 
scanf(%d, &i);

答案 5 :(得分:1)

不,你错了,ip不是整数指针。 ip的类型是整数指针,即你分配给ip的应该是一个整数指针。但你没有给ip分配任何东西。那么你期望scanf存储整数值?