使用空字符串初始化字符串

时间:2016-04-07 05:25:23

标签: c string strcmp

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

#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比较单词“”确定?

2 个答案:

答案 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中,它是未定义的行为

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

这恰好适合你的情况。幸运的是,你没有尝试写入那个记忆。如果你这样做,可能会发生坏事。