在C中按值传递字符串

时间:2011-04-09 22:33:14

标签: c pointers

我有两个函数,一个用于创建指向字符串的指针,另一个用于操作它。不管怎样,我错过了一些关键的东西:

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 个答案:

答案 0 :(得分:6)

C没有字符串作为第一类值;您需要使用strcpy()来分配字符串。

strcpy(mystring[0], "hahaha");

答案 1 :(得分:3)

使用malloc是必要的,但这样做: mystring[0] = malloc(strlen(mystring) + 1); 是错误的,因为你不能在mystring上执行strlen(因为它还没有包含任何字符串,因为指针本身没有被初始化)。使用字符串大小分配缓冲区。例如:

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

顺便说一句,你可以使用*mystring = "hahaha";赋值malloc,因为这是一个存储在数据部分的字符串,从函数返回后数据不会丢失,但是这样它是只读数据,您无法修改它。 strcpy用于将字符串复制到分配的缓冲区。

答案 2 :(得分:3)

除了给出的其他答案外,请注意:

mystring[0]

相同
*(mystring + 0)

相同
*mystring

你的malloc分配内存,指针写入mystring,但是被下一行覆盖。