我有两个函数,一个用于创建指向字符串的指针,另一个用于操作它。不管怎样,我错过了一些关键的东西:
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;
}
对我的大脑的任何启发都将不胜感激!
答案 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,但是被下一行覆盖。