Почему после использования strdup(value)
(int)value
возвращает вам другой вывод, чем раньше?
Как получить такой же вывод?
Мой короткий пример испортился, пожалуйста, используйте длинный:
Вот полный код для тестов:
#include <stdio.h>
#include <iostream>
int main()
{
//The First Part
char *c = "ARD-642564";
char *ca = "ARD-642564";
std::cout << c << std::endl;
std::cout << ca << std::endl;
//c and ca are equal
std::cout << (int)c << std::endl;
std::cout << (int)ca << std::endl;//The Second Part
c = strdup("ARD-642564");
ca = strdup("ARD-642564");
std::cout << c << std::endl;
std::cout << ca << std::endl;
//c and ca are NOT equal Why?
std::cout << (int)c << std::endl;
std::cout << (int)ca << std::endl;
int x;
std::cin >> x;
}
Поскольку массив распадается на указатель в вашем случае, вы печатаете указатель (т.е. на не экзотических компьютерах адрес памяти). Нет гарантии, что указатель вписывается в int
,
В первой части вашего кода c
а также ca
не должно быть равным. Ваш компилятор выполняет своего рода оптимизацию памяти (см. Вот для полного ответа).
Во второй части strdup
динамически выделяет строку дважды, так что возвращаемые указатели не равны. Компилятор не оптимизирует эти вызовы, потому что он, кажется, не контролирует определение strdup
,
В обоих случаях, c
а также ca
не может быть равным
«Функция strdup () должна возвращать указатель на новая строка, который является дубликатом строки, на которую указывает s1. » источник
Так что вполне понятно, что указатели отличаются.