C - 字符串的最佳实践

时间:2015-09-25 10:12:08

标签: c arrays string

使用C字符串时,以下哪项是最佳做法?

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

从安全角度来看,每个人的利弊是什么?

3 个答案:

答案 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 :(得分:3)

character pointer中,可以使用character arraychar str[4] = "GfG"; /*One extra for string terminator*/ /* OR */ char str[4] = {‘G’, ‘f’, ‘G’, '\0'}; /* '\0' is string terminator */ 来引用字符串。

字符串作为字符数组

str[]

当字符串被声明为字符数组时,它们就像C中的其他类型的数组一样存储。例如,如果stack segmentauto variable,则字符串存储在global中,如果它是staticcharacter pointer变量,然后存储在data segment等中。

使用字符指针的字符串

使用data segment字符串可以通过两种方式存储:

  1. 共享段中的只读字符串。

    当字符串值直接分配给指针时,在大多数编译器中,它存储在函数之间共享的只读块(通常在char *str = "GfG"; 中)。

    “GfG”

    在上面的行str存储在共享的只读位置,但指针str存储在读写存储器中。您可以将str更改为指向其他内容,但目前无法更改值heap segment。所以这种字符串只应在我们不想在程序的后期修改字符串时使用。

  2. 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'}
    
  3. For more details

答案 2 :(得分:-2)

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