【问题标题】:char pointer initialization in CC中的char指针初始化
【发布时间】:2012-06-18 19:19:07
【问题描述】:

我不太清楚字符指针及其工作原理。

程序可以编译,但运行时崩溃。

 char *ab = NULL;
 //ab = "abc123"; // works fine
 sprintf(ab, "abc%d", 123); // this line seems to crash the program

当 sprintf 将 (char * str) 作为第一个参数时,我不明白这是怎么回事。

谁能给我解释一下?

【问题讨论】:

    标签: c string pointers char


    【解决方案1】:

    您没有分配任何内存用于ab

    第一个赋值有效,因为您正在为 ab 赋值一个字符串常量:"abc123"。常量字符串的内存由编译器代表您提供:您不需要分配此内存。

    在您可以使用 ab 之前,例如sprintf,您需要使用malloc 分配一些内存,并将该空间分配给ab

    ab = malloc(sizeof(char) * (NUM_CHARS + 1));
    

    那么只要您使用malloc 腾出足够的空间,您的sprintf 就可以工作。注意:+ 1 代表null terminator

    或者,您可以通过将 ab 声明为数组来为它创建一些内存:

    char ab[NUM_CHARS + 1];
    

    如果不为ab 分配内存,sprintf 调用将尝试写入NULL,这是未定义的行为;这就是你崩溃的原因。

    【讨论】:

    • sizeof(char) 保证为1(不要与CHAR_BITS 混淆),因此没有必要。您还应该提到您需要为结尾的'\0' 分配空间。
    【解决方案2】:

    您需要为数据分配内存。确实sprintf 需要char*,但它不会为你分配内存。

    第一行工作正常,因为编译器会自动为编译时定义的字符常量表分配数据。

    【讨论】:

      【解决方案3】:

      Java 或其他高级语言不同,C 库的许多字符串函数不简单地设置字符串引用,而是对称为字符数组的预分配内存块进行操作。

      您的第一行是说ab 指向一个不存在的内存位置。

      如果不是char *ab = NULL;,你会更幸运:

      char ab[12];
      

      或:

      char *ab = (char*)malloc(12);
      

      【讨论】:

        【解决方案4】:

        你可以这样做

        char ab[10];  //allocate memory
        sprintf(ab, "abc%d", 123);
        

        【讨论】:

          【解决方案5】:

          "ab" 为 null 且 sprintf 正在尝试写入,您必须先分配它。

          char ab[20];
          
          sprintf(ab, "abc%d", 123); //
          

          char * ab = malloc(20); // new, whatever
          
          sprintf(ab, "abc%d", 123); //
          

          【讨论】:

          • new, whatever 有点没用,因为它是 C,而不是 C++
          【解决方案6】:

          这里有几件事需要考虑。您的原始示例如下:

          char *ab = NULL;
           //ab = "abc123"; // works fine
           sprintf(ab, "abc%d", 123); // this line seems to crash the program
          

          char *ab = NULL;是指向字符的指针,初始化为NULL;

          我不认为 ab = "abc123"; 工作得很好,除非它看起来像 char *ab = "abc123";。那是因为您将char *ab 初始化为只读字符串。初始化可能发生在编译时。

          您的sprintf(ab, "abc%d", 123); 行失败,因为您没有提前为char *ab 指针初始化任何内存。换句话说,你没有做类似的事情:

          ab = malloc((sizeof(char) * 3) + 1); /* + 1 allows for null string terminator. */
          

          您可以通过以下两种方式之一来解决您的问题。如上所示分配动态内存,或者您可以使字符串成为一个固定长度的数组,如 char ab[25] = {0};。通常,我会创建一个长度为 1024、256 或某个数字的数组,这些数字通常会涵盖我的大部分字符串长度情况。然后我将 char 指针用于对数组进行操作的函数。

          【讨论】:

            猜你喜欢
            • 2011-04-10
            • 1970-01-01
            • 1970-01-01
            • 2023-03-17
            • 2018-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多