Передача строк по значению в C - PullRequest
2 голосов
/ 10 апреля 2011

У меня есть две функции: одна создает указатель на строку, а другая управляет ею.Однако я почему-то упускаю что-то критическое:

int foo() {
   char * mystring; // Create pointer
   bar(&mystring); // Pass in address
   printf("%s\n", mystring);
   return 0; // There's a reason for this
}

int bar(char ** mystring) {
   mystring[0] = malloc(strlen(mystring) + 1); // Since malloc will persist even after exiting bar
   *mystring = "hahaha"; // Dereference
   return 0; 
}

Любое просвещение для моего растерянного мозга будет с благодарностью!

Ответы [ 3 ]

6 голосов
/ 10 апреля 2011

C не имеет строк в качестве значений первого класса; вам нужно использовать strcpy() для назначения строк.

strcpy(mystring[0], "hahaha");
3 голосов
/ 10 апреля 2011

В дополнение к другим данным ответам, обратите внимание, что:

mystring[0]

совпадает с

*(mystring + 0)

, что совпадает с

*mystring

Ваш malloc выделяет память, и указатель записывается в mystring, но перезаписывается следующей строкой.

3 голосов
/ 10 апреля 2011

Использование malloc необходимо, но так: mystring[0] = malloc(strlen(mystring) + 1); неправильно, так как вы не можете выполнить strlen для mystring (потому что он еще не содержит никакой строки и потому что сам указатель не являетсяинициализируется).Выделите буфер с размером вашей строки.например:

int bar(char ** mystring) {
   char* hello = "hahaha";
   *mystring = malloc(strlen(hello) + 1);
   strcpy(*mystring, hello);
   return 0; 
}

Кстати, вы можете использовать присвоение *mystring = "hahaha"; без malloc, так как это строка, хранящаяся в разделе данных, и данные не будут потеряны после возврата из функции, но таким образом это только для чтения данных, и вы не можете изменить их.strcpy существует для копирования строки в выделенный буфер.

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