давая строковое значение целому числу, что происходит? - PullRequest
0 голосов
/ 06 ноября 2019

В моей программе на C я присваиваю строку в одной целочисленной переменной и печатаю с процентом% s, она будет печатать эту строку с целым числом предупреждения в указателе без приведения и печатать с% d, она печатает 134513904, затем я изменяю значение строки и печатаюс% d "134513904" печатает, что это за значение и как целочисленная переменная хранит строковое значение в переменной int?

enter code here
         #include<stdio.h>
            main()
{
        int a="naveen";
        printf("%d\n",a);
        printf("\n%s\n",a);
        if("naveen")
        {
                printf("hi");
       }
int_point.c: In function ‘main’:

int_point.c: 22: 8: предупреждение: инициализация делает целое число из указателя безcast [включен по умолчанию] int a = "naveen";^ int_point.c: 24: 2: предупреждение: формат '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'int' [-Wformat =] printf ("\ n% s \ n", a);^ 134513920

Навин привет

1 Ответ

2 голосов
/ 06 ноября 2019

Следующее присваивает указатель (не строка) s:

const char *s = "navven";

Это означает, что следующее присваивает указатель (не строка)) до a:

int a = "naveen";

Компьютеры на самом деле не видят разницы между указателем и числом. Они обе вещи, которые вписываются в их регистры. И некоторые люди пользуются этим фактом. Таким образом, хотя компилятор предупреждает вас о том, что вы делаете что-то не так, он все равно позволяет вам обращаться с указателем как с числом.

Так что значение a заканчивается значением указателя, если оно было int,Это небезопасно. Не совсем. Хотя вы не можете безопасно использовать int, вы можете безопасно использовать intptr_t.

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main(void) {
    const char *p1 = "naveen";
    printf("%p %s\n", p1, p1);

    intptr_t i = (intptr_t)p1;
    printf("0x%" PRIxPTR "\n", i);

    const char *p2 = (const char*)i;
    printf("%p %s\n", p2, p2);

    return 0;
}

Вывод:

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