未填充的静态char数组

时间:2013-11-15 12:51:27

标签: c unix static

我想逐个填充一个char数组,所以我使用上面的代码进行测试,“str”的最终输出将始终是第一个输入的char而不是所有的char,是什么错误的?< / p>

void gime_char(char c)
{
    static *str;
    static i;

    if(i == 0)
        str = malloc(sizeof(*str) * 10);
    if(c == 'X')
    {
        printf("full str:%s\n", str);
    }
    printf("c == %c\n", c);
    str[i] = c;
    printf("d == %d\n", i);
    i++;
}

int main()
{
    char c;

    while(c != 'X')
    {
        c = getchar();
        gime_char(c);
    }
}

4 个答案:

答案 0 :(得分:2)

static *str的类型为static int *str,但字符串由char组成。所以现在你的字符串不会像你期望的那样以彼此相邻的字符存储,因为str的每个元素的大小都是int(可能是4个字节),而不是char的大小。 {1}}。

应通过将类型指定为static char *str来修复此部分代码。解决这个问题后,打印str时会出现另一个问题,而不会使用NUL字符('\0')终止它。

答案 1 :(得分:2)

您在i的定义中缺少类型,str定义中的类型不完整:您说“指针”(带有*字符)但是你不要说什么。由于历史原因,如果省略类型,编译器会认为您的意思是int;这是不推荐的,好的编译器警告这一点。

由于您有效地编写了int *str,因此在输入hello之后内存布局看起来像这样(这是与机器相关的,但这是一个非常典型的情况):

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+----
| 'h' |   0 |   0 |   0 | 'e' |   0 |   0 |   0 | 'l' |   0 | ...
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+----
 ^                       ^                       ^
 |                       |                       |
str                    str+1                   str+2

每个小单元格是一个字节(对应于一个字符)。四个单元组成一个int。这条线

str[i] = c;

将一个int写入str。例如,当c'h'且数值为104时,数字104将写入int对象str[0],表示为四字节序列{104, 0, 0, 0}。对于下一个字符会再次发生这种情况,该字符在数组中的下一个int大小的插槽中写入,这意味着还有4个字节。

在第

printf("full str:%s\n", str);

您将str打印为字符串。在字符串中,第一个零字节标记字符串的结尾。所以你看到字符串"h"

您的计算机为little-endian。练习:你会在大端机器上看到什么?

修复方法是正确声明类型。

您还应该初始化变量。 static变量无论如何都被初始化为0,但如果你明确地这样做,它会更清楚。变量c不是static,因此它开始包含之前存储在内存中的任何值;这可能恰好是'X',因此您必须明确初始化它。

此外,您需要确保字符串在打印前以零字节终止。 static关键字确保str变量初始化为空指针,但指针指向的空间由malloc分配,并包含之前的任何内容。

void            gime_char(char c)
{
  static        char *str;         /* <<<< */
  static        int i;             /* <<<< */

  if(i == 0)
    str = malloc(sizeof(*str) * 10);
  if(c == 'X')
    {
      str[i] = 0;                 /* <<<< */
      printf("full str:%s\n", str);
    }
  printf("c == %c\n", c);
  str[i] = c;
  printf("d == %d\n", i);
  i++;
}

int             main()
{
  char          c = 0;             /* <<<< */

  while(c != 'X')
    {
      c = getchar();
      gime_char(c);
    }
  return 0;                        /* <<<< */
}

答案 2 :(得分:1)

建议:

  • 检查malloc是否没有返回错误
  • 我没有初始化
  • * str的类型错误(静态字符* str)
  • 在使用%s之前,您必须添加&#39; \ 0&#39;在你的字符串的末尾。

答案 3 :(得分:0)

我会说你的问题来自你声明static *str;的事实。 你声明它没有指定类型!编译器通过,警告这意味着int。所以基本上你最终会得到一个指向int的静态指针。这并不意味着存储ANSI字符串。

稍后您使用str = malloc(sizeof(*str) * 10);为缓冲区(我猜)分配空间。这也是错误的,因为你为str 的10个指针分配了空间。

您想要使用角色。

static char *str;
if(i == 0)
  str = malloc(sizeof(char) * 10);

此外,您应该将字符串初始化为零,因为几乎可以肯定您将获得一些垃圾,并且ANSI字符串应该NULL终止。最好是i,但编译器会在堆栈上初始化变量。