使用C字符串时,以下哪项是最佳做法?
char full_name[] = "foo boo";
char * full_name = "foo boo";
从安全角度来看,每个人的利弊是什么?
答案 0 :(得分:4)
使用c字符串是一项复杂的任务,您展示的选项都没有任何优点或缺点。这实际上取决于您想要实施的解决方案。
char full_name[] = "foo boo";
是一个包含以下内容的数组
{'f', 'o', 'o', ' ', 'b', 'o', 'o', '\0'}
你可以修改它但不能增长,
char *full_name = "foo boo";
是一个字符串文字,你不能修改也不能增长,最好像这样定义它
const char *full_name = "foo boo";
尽管这并不能完全阻止修改它,但它有助于不会意外地进行修改。
修改字符串文字是可能的,它只是错误,因为它调用了undefined behavior。
答案 1 :(得分:3)
在character pointer
中,可以使用character array
或char str[4] = "GfG"; /*One extra for string terminator*/
/* OR */
char str[4] = {‘G’, ‘f’, ‘G’, '\0'}; /* '\0' is string terminator */
来引用字符串。
字符串作为字符数组
str[]
当字符串被声明为字符数组时,它们就像C中的其他类型的数组一样存储。例如,如果stack segment
是auto variable,则字符串存储在global
中,如果它是static
或character pointer
变量,然后存储在data segment等中。
使用字符指针的字符串
使用data segment
字符串可以通过两种方式存储:
共享段中的只读字符串。
当字符串值直接分配给指针时,在大多数编译器中,它存储在函数之间共享的只读块(通常在char *str = "GfG";
中)。
“GfG”
在上面的行str
存储在共享的只读位置,但指针str
存储在读写存储器中。您可以将str
更改为指向其他内容,但目前无法更改值heap segment
。所以这种字符串只应在我们不想在程序的后期修改字符串时使用。
在C
中动态分配。
字符串与char *str;
int size = 4; /*one extra for ‘\0’*/
str = malloc(size);
*(str+0) = 'G';
*(str+1) = 'f';
*(str+2) = 'G';
*(str+3) = '\0';
中的其他动态分配的内容一样存储,并且可以在函数之间共享。
${myBoolean ? 'Yes' : 'No'}
答案 2 :(得分:-2)
如果您看到安全角度,那么请不要使用指针。尝试始终使用非指针变量。指针直接访问内存地址,这可能导致内存泄漏问题,内存黑客问题等。