我想逐个填充一个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);
}
}
答案 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)
建议:
答案 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
,但编译器会在堆栈上初始化变量。