用空字符串初始化一个字符串

Initializing a string with the empty string

我想知道是否可以像这样用空字符串初始化一个字符串:

#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 将单词与 "" 进行比较可以吗?

呃,哦!您为字符串分配内存并将分配的内存句柄存储在 w:

char* w = malloc(100*sizeof(char));

在下一行中,您用不可变的字符串文字覆盖该句柄:

w = "";

这意味着 (1) 您在使用后不能再释放 w 并且 (2) w 现在指向只读内存中的一个字符串,其修改将导致未定义的行为,很可能是崩溃。

动态分配的内存表现得像一个数组。 C 字符串是字符数组,其中包含字符串的有效字符,直到空终止符 '[=18=]'。因此,将第一个字符设置为空字符将为您提供一个空字符串:

*w = '[=12=]';

w[0] = '[=13=]';

在死分支中,您想用字符串的内容填充字符数组,但您也分配了一个只读文字。您可以使用 <string.h> 中的函数 strcpy 来用字符串填充字符数组:

strcpy(w, "Not empty anymore");

但是,您必须确保数组足够大以容纳字符串和终止空字符。

嗯,这是有可能的,但它不会像您期望的那样运行。在更新的 C 版本中,它是 未定义的行为

您所做的是分配内存,然后丢弃该指针,从而泄漏该内存。您将指针替换为指向 字符串文字 非常量 指针(这应该会使您的编译器发出警告或错误)。

这恰好适用于您的情况。幸运的是,您没有尝试写入该内存。如果你这样做了,很可能会发生不好的事情。