Назначенный вручную адрес перезаписывается компилятором? (Пожалуйста, смотрите код) - PullRequest
0 голосов
/ 25 января 2020

Некоторые интересные ошибки появляются, когда я запускаю этот код ... Внутри ввода l oop все выглядит нормально (не совсем, адреса не работают должным образом, но эй! *c по крайней мере, дает мне правильное значение )

Однако на выходе l oop все становится не так. Может кто-нибудь сказать мне, почему?

#include<stdio.h>

int main(void)
{
    char a;
    int count = 1, flag = 0;
    unsigned long int f = (unsigned long int)&a;
    do
    {
        char *c = (char*)(f+count);
        char temp = getchar();
        if (temp == '\n')
        {
            flag = 1;
            *c = '\0';
        }
        else
            *c = temp;
        printf("%p %c\n", c, *c);
        count++;
    }
    while( flag == 0);

    count = 0;
    char *h = (char *)f+1;
    do
    {
        printf("%p\n", (h+count));
        count++;
    } while (count < 5);

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Не «адреса не работают», вы неправильно используете язык.

Похоже, вам нужно узнать о C концепциях памяти.

Здесь у вас есть один char a, но вы хотите записать туда, возможно, много символов ... Получая доступ к нему через указатель, затем увеличивая указатель, вы вводите некоторые адреса памяти, к которым вы не должны прикасаться.

Посмотрите на https://en.m.wikibooks.org/wiki/C_Programming/stdio.h/getchar

0 голосов
/ 25 января 2020

Если я понимаю, что вы хотите сказать - вы хотите сохранить строку в объекте другого типа

char *getStringToAnotherType(FILE *fp, void *mydata, size_t sizeofMyData)
{
    return fgets(mydata, sizeofMyData, fp);
}

int main(void)
{
    int x;
    double y;
    char *str = getStringToAnotherType(stdin, &x, sizeof(x));
    printf("\"%s\"\n", str);

    str = getStringToAnotherType(stdin, &y, sizeof(y));
    printf("\"%s\"\n", str);
}

https://godbolt.org/z/TGmnX7

...