用空字符串初始化一个字符串
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 版本中,它是 未定义的行为。
您所做的是分配内存,然后丢弃该指针,从而泄漏该内存。您将指针替换为指向 字符串文字 的 非常量 指针(这应该会使您的编译器发出警告或错误)。
这恰好适用于您的情况。幸运的是,您没有尝试写入该内存。如果你这样做了,很可能会发生不好的事情。
我想知道是否可以像这样用空字符串初始化一个字符串:
#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 版本中,它是 未定义的行为。
您所做的是分配内存,然后丢弃该指针,从而泄漏该内存。您将指针替换为指向 字符串文字 的 非常量 指针(这应该会使您的编译器发出警告或错误)。
这恰好适用于您的情况。幸运的是,您没有尝试写入该内存。如果你这样做了,很可能会发生不好的事情。