как передать значение в целочисленный указатель - PullRequest
7 голосов
/ 26 марта 2011
#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

Я проверил в строке 6 gdb проблема, которая

scanf("%d",ip);

Итак, я заключаю, что ip является указателем на целое число, а %d ожидает значение адреса.Хотя я пытаюсь передать целое число в значение, указанное ip, я думаю, что это неправильно.Но как правильно поступить в вышеуказанной ситуации.Я хочу использовать сканирование и назначить целочисленное значение адресу, на который указывает ip (который в моем случае отсутствует).

Ответы [ 6 ]

6 голосов
/ 26 марта 2011

Решение Дэвида Хеффернана верно. Однако, если вы хотите использовать указатель (чтобы узнать, как работает указатель), вы должны вручную выделить переменную с помощью "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 ().

5 голосов
/ 26 марта 2011

Вы не выделили никакого хранилища, только указатель. Указателю нужно на что-то указать. Вы должны сделать это так:

#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 голосов
/ 26 марта 2011

Вот один из способов исправить это:

#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() пытается разыменовать этот указатель для записи данных в него.

1 голос
/ 26 марта 2011

Нет, вы не правы, ip не является целочисленным указателем. тип ip является целочисленным указателем, то есть то, что вы назначаете ip, должно быть целочисленным указателем. Но вы ничего не назначали на ip. Итак, где вы ожидаете, что scanf хранит целочисленное значение?

1 голос
/ 26 марта 2011

Вы должны выделить память.

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

Или просто передайте адрес переменной стека

int i; 
scanf(%d, &i);
1 голос
/ 26 марта 2011

Вам необходимо назначить память этому указателю.

int *ip = malloc(sizeof(int));
// do stuff with ip

free(ip); //free the memory allocated

Дополнительно: http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...