【问题标题】:What is the best way to initialize a pointer to a char array as mutable?将指向 char 数组的指针初始化为可变的最佳方法是什么?
【发布时间】:2014-09-02 17:41:41
【问题描述】:

很明显,像

这样初始化一个char数组
char* string = "foobar";

将使其不可变。另一方面,初始化一个 char 数组,如

char string[] = "foobar";

将使其可变。

对指向 char 数组的指针进行可变初始化的最佳方法是什么?

// member char arrays are immutable
char* arr[] = {"foo", "bar"};

【问题讨论】:

  • 轻微修正:它在所有系统上是不可变的。一些系统只是无法捕获未定义的行为并崩溃,但如果它们不这样做,可能会发生更糟糕的事情:例如,两个具有相同内容的字符串文字,或者一个是另一个的尾部,可以共享相同的内容内存,因此尝试修改一个会导致您的程序在另一个中看到修改!

标签: c arrays char


【解决方案1】:

假设您可以使用 C99 功能,那么复合文字就可以解决问题:

char *arr[] = { (char[]){"foo"}, (char[]){"bar"} };

【讨论】:

    【解决方案2】:

    一种选择是猜测数组中字符串的最大大小,并使用:

    char arr[][SIZE] = {"foo", "bar"};
    

    SIZE 将替换为数字。

    char arr[][4] = {"foo", "bar"};
    

    给定字符串会起作用,但如果你使用它就不会:

    char arr[][4] = {"foo", "fubar"};
    

    当这样一行被编译时,gcc 会打印以下警告:

    警告:字符数组的初始化字符串太长[默认启用] char arr[][4] = {"foo", "fubar"};

    如果您使用不同的编译器,它可能不会抱怨。请注意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多