char* str1="string";
这使得str1 成为一个指针;它指向字符串文字的第一个字符。您应该将其定义为const,因为您不允许修改字符串文字:
const char *str1 = "string";
...
char str2[7]="string";
这使str2 成为char 的数组(不是指针),并将字符串文字的内容复制到其中。无需将其定义为const;数组本身是可写的。你也可以省略大小,让它由初始化器决定:
char str2[] = "string";
然后是sizeof str2 == 7("string" 为 6 个字节,终止 '\0' 为 1)。
这个:
char* str3=(char)malloc(sizeof(char)*7);
写错了,它甚至不应该编译;至少,你应该从你的编译器那里得到一个警告。您将malloc() 的结果转换为类型char。您应该将其转换为 char*:
char *str3 = (char*)malloc(sizeof(char) * 7);
但是强制转换是不必要的,并且在某些情况下可以掩盖错误;请参阅comp.lang.c FAQ 中的问题 7.7 及以下内容:
char *str3 = malloc(sizeof(char) * 7);
但是sizeof(char)的定义是1,所以你可以写:
char *str3 = malloc(7);
malloc() 分配内存,但它不会初始化它,所以如果你尝试打印str3 指向的字符串,你会得到垃圾——如果分配的空间甚至会导致运行时崩溃碰巧不包含终止空字符'\0'。可以用strcpy()初始化,例如:
char *str3 = malloc(7);
if (str3 == NULL) {
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
strcpy(str3, "string");
您必须非常小心,要复制的数据不大于分配的空间。 (不,`strncpy() is not the answer to this problem。)
void main() 不正确;它应该是int main(void)。如果您的教科书告诉您使用void main(),请找到更好的教科书;它的作者不太了解 C。
对于您正在使用的任何库函数,您需要适当的 #include 指令:<stdio.h> 用于 printf(),<stdlib.h> 用于 exit() 和 malloc(),<string.h> 用于 strcpy()。每个函数的文档都应该告诉您要包含哪个标头。
我知道这需要吸收很多;不要指望一下子就明白了。
我提到了comp.lang.c FAQ;这是一个很好的资源,尤其是第 6 节,它讨论了数组和指针以及它们之间经常令人困惑的关系。
至于您的问题 3,如何从 C 函数返回一个字符串,由于 C 进行内存分配的方式(基本上它留给自己管理),结果出奇地复杂。您不能安全地返回指向局部变量的指针,因为当函数返回时该变量不再存在,给调用者留下一个悬空指针,因此返回您的 str2 是危险的。返回字符串文字是可以的,因为它对应于在整个程序执行过程中存在的匿名数组。你可以用static声明一个数组并返回一个指向它的指针,或者你可以使用malloc()(这是最灵活的方法,但这意味着调用者需要free()内存),或者你可以要求调用者传递一个指向缓冲区的指针,您的函数会将结果复制到该缓冲区中。
某些语言允许您构建一个字符串值并简单地从函数中返回它。正如您现在发现的那样,C 不是其中一种语言。