我想知道是否可以用这样的空字符串初始化字符串:
#include <stdio.h>
#include <string.h>
char* some_function() {
char* w = malloc(100*sizeof(char));
w = "";
if (1 == 2) {
w = "Not empty anymore";
}
return w;
}
int main(void) {
char* word = some_function();
int r = strcmp("", word);
printf("%s\n", word);
printf("%d\n", r);
return 0;
}
它编译得很好并且给了我想要的结果,但是我在C时仍然很新,并且想知道这是否会导致任何问题。同样是我使用strcmp比较单词“”确定?
答案 0 :(得分:3)
w
中的已分配内存:
char* w = malloc(100*sizeof(char));
在下一行中,使用不可变的字符串文字覆盖该句柄:
w = "";
这意味着(1)你不能再使用w
后使用它和(2)w
现在指向只读内存中的字符串,其修改将导致未定义的行为,很可能是崩溃。
动态分配的内存的行为类似于数组。 C字符串是包含字符串有效字符的字符数组,最多为空终止符'\0'
。因此,将第一个字符设置为空字符将为您提供一个空字符串:
*w = '\0';
或
w[0] = '\0';
在死分支中,您希望使用字符串的内容填充字符数组,但也分配了只读文字。您可以使用strcpy
中的函数<string.h>
用字符串填充字符数组:
strcpy(w, "Not empty anymore");
但是,您必须确保该数组足以容纳字符串和终止空字符。
答案 1 :(得分:3)
嗯,这有点可能,但它不会按照你期望的方式行事。在更新版本的C中,它是未定义的行为。
你所做的是分配内存,然后将指针扔掉,从而泄漏内存。您用指向字符串文字的非常量指针替换了指针(这应该会使您的编译器发出警告或错误)。
这恰好适合你的情况。幸运的是,你没有尝试写入那个记忆。如果你这样做,可能会发生坏事。