2015-09-25 32 views
0

下面哪个是使用C字符串的最佳实践?C - 字符串的最佳实践

char full_name[] = "foo boo"; 
char * full_name = "foo boo"; 

从安全的角度来看,他们每个人的优点和缺点是什么?

+3

你寻找他们SO? – ameyCU

+1

http://stackoverflow.com/q/1704407/3049655 –

+0

请注意问题是不同的。我不是在问幕后发生了什么,我清楚地问使用什么更安全。 –

回答

4

使用字符串是一项复杂的任务,您所展示的任何选项都没有任何优点或缺点。这实际上取决于你想要实现的解决方案。

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

'char * full_name =“foo boo”;'将文字赋值给变量(用文字初始化变量)。您不能更改文字字符串,但是您可以为该变量指定另一个文字或变量,例如'full_name = my_name;'。 –

+0

@PaulOgilvie严格地说,你可以改变它,它只是*未定义的行为*。 –

+0

我的意思是因为'char * full_name;'是一个指针变量,所以可以为它分配不同的(其他)变量。这些可以是文字,也可以是包含例如字符串的“malloc”缓冲区。从文件中读取。这不是UB。 –

-2

如果您看到安全角度,请不要使用指针。尝试始终使用非指针变量。指针直接访问内存地址,这可能导致内存泄漏问题,内存破解问题等。

+8

指针是C的重要组成部分,对于任何非平凡的程序都是必需的。学会正确使用它们(学习const正确性,拥有明确的所有权等)要比歇斯底里地避免它们更好。 – user694733

+0

如果您不想使用指针,请使用其他编程语言。此外,上述两个选项中的任何一个都使用指针,您是否建议一种使用[tag:c]中不涉及指针的字符串的方法? –

+0

这是一个有趣的视角,我无法理解你将如何处理它?你是否真的在C/C++/Objective C中实现了系统而不使用指针? – wmorrison365

3

C中,字符串可以使用character pointercharacter array来引用。

字符串作为字符数组

char str[4] = "GfG"; /*One extra for string terminator*/ 
/* OR */ 
char str[4] = {‘G’, ‘f’, ‘G’, '\0'}; /* '\0' is string terminator */ 

当字符串被声明为字符数组,它们被存储在像C.其它类型的阵列。例如,如果str[]auto variable然后字符串存储在stack segment ,如果它是一个globalstatic变量然后存储在data segment等使用字符指针

字符串

使用character pointer字符串可以存储在两个方面:

  1. 在一个共享网段的只读字符串。

    当字符串值被直接赋值给一个指针时,在大多数编译器中,它存储在一个只读函数中的只读块(通常在data segment)。

    char *str = "GfG"; 
    

    在上述线“GfG”被存储在共享的只读位置,但指针str被存储在读 - 写存储器。您可以将str更改为点其他值,但目前str无法更改值。所以这种类型的字符串应该只在我们不想在程序的后续阶段修改字符串时使用。

  2. 动态分配在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'; 
    

For more details