2015-04-07 2 views
2

У меня есть путаница со следующей программойКак сохранить строку в указатель char?

#include<stdio.h> 
void main() 
{ 
char *string; 
string = (char *)malloc(5); 
string = "abc"; // <<<<<<<<<< why *string="abc" is not working. How string = "abc" is working? 
printf("%s", string); 
} 

Но та же программа с целочисленными работает

char *i; 
i=(int *)malloc(sizeof(int)); 
*i=4; <<<<<<<< this is working fine 
printf("%d",*i); 
+1

всегда предпочитают 'Int основной (вакуум)' 'над недействительным основной()' –

+1

Standard Предупреждение: [не отбрасывают] (http://stackoverflow.com/q/605845/ 2173917) возвращаемое значение 'malloc()' и family в 'C'. –

ответ

0

Почему *string = "abc" не работает?

string определяется как указатель на символ. *string - это символ. "abc" - строковый литерал. Вы на самом деле присвоения адреса строки буквального СИМВОЛУ и компилятор должен издать предупреждение, как:

warning: assignment makes integer from pointer without a cast 

Например, *string = 'a'; будет работать, потому что только один символ присваивается.

Как работает string = "abc"?

Поскольку адрес строкового литерала "abc" присваивается string, который является указателем на символ.

И BTW, делая это, вы потеряли ранее выделенную память на malloc() и произвели утечку памяти.

Как сохранить строку в указателе на символ? Вы можете использовать только:

strcpy(string, "abc"); 
+0

Итак, вы хотите сказать, что когда мы присваиваем строковый литерал, он будет храниться где-то в памяти и этот адрес будет назначен? – Karthick

+0

Да. Дополнительно используйте 'char * string =" abc ";' вы не можете изменить контент позже. См., Например, [C Program String Literals] (http://stackoverflow.com/questions/7774770/c-program-string-literals) –

1

*string это указывают единственный character.Here "abc" является строка символов. Это не характер.

*string='a'; // It will work. 

Don't cast результат таНос и его семьи.

Для этого вы можете использовать функцию strcpy.

strcpy(string,"abc"); 
Смежные вопросы