C char *分配

时间:2014-01-04 16:31:17

标签: c pointers

我开始学习C,我想创建一个字符串。我正在使用的例子是这样做的:

char *c = malloc(2 * sizeof(char)); // 2

*c = 'A';
*c++ = 'B';

printf('%s', c); //doesn't print anything?

所以我的问题是,如何打印字符串AB?

5 个答案:

答案 0 :(得分:11)

通过这样做:*c++ = 'B';你增加了指针。这就是printf不会打印任何内容的原因。

C和C ++中的字符串需要以零字节(\x00)结尾。 printf依靠此功能正常运行。正确的方法(关于你的代码)将是:

char *c = malloc(3 * sizeof(char)); // 2

*c = 'A';
*(c+1) = 'B';
*(c+2) = 0

printf("%s", c);

这绝不是有效的。通常我们声明这样的文字字符串:

char *c = "ab";

如果你想要了解指针是如何工作的。然后你的方法是一个很好的练习。只需要了解一元++运算符会增加应用的变量,因此,c指针在应用后不会再指向字符串的开头。这就是为什么*(c+1)正在寻找的原因。

答案 1 :(得分:3)

  1. 您需要一个有效的C字符串(具有空终止字符)。所以添加

    *c = '\0'; // at the end

  2. 您正在使用'A'覆盖'B'。如果您想要字符串"AB",请执行:

    *c++ = 'A';
    *c++ = 'B';

  3. 您已增加c,因此它不再指向字符串的开头。将指针保存到最开头:

    char* str = c;
    // Now modify c
    printf("%s", str);

  4. 您将'%s'传递给printf,这是错误的。您需要传递字符串"%s")。见#3。

  5. 正如@sharth指出的那样(我错过了),你也只为2 char分配空间,但是如果你想要字符串"AB",你需要3个空格{ {1}} s(一个用于char,一个用于'A',另一个用于'B'

  6. 将它们放在一起,看起来像:

    '\0'

答案 2 :(得分:2)

首先,你必须记住在C中使用字符串时非常重要的东西,它们由NULL字符'\ 0'终止,因此在动态创建字符串时务必为它腾出空间。

char *c = malloc(3 * sizeof(*c)); // You want to create the string AB so make room for 3
c[0] = 'A';
c[1] = 'B';
c[2] = '\0'; // Terminate the string with the \0 character 

答案 3 :(得分:0)

char *c = malloc(3);
strcpy(c, "AB");
printf("%s", c);

答案 4 :(得分:-1)

您需要解决4个问题:

  1. 预留3个空格(不是2个)以容纳2个字符。

  2. \0添加到最后一个以终止char *

  3. 正如@PauloBu所说,*c++ = 'B'只会增加指针而不是您要设置的地址,您应该使用*(c+1)代替。

  4. 使用"%s"打印char *代替'%s'

  5. 总之,您的代码需要更改为

    char *c = (char *) malloc(3 * sizeof(char)); // 3
    
    *c = 'A';
    *(c+1) = 'B';
    *(c+2) = '\0';
    
    printf("%s", c);