我有一个像这样初始化的char *数组:
char *keys[16]; //16 elements, each of which is a char *
然后我像这样分配给这个数组:
for(i = 0; i < NUM_ROUNDS; i++)
{
//do some operations that generate a char* holding 48 characters named keyi
keys[i] = keyi;
}
但是当我打印出char *数组的所有元素时,我在print语句的末尾得到了垃圾:
int k;
for(k = 0; k < 16; k++)
{
printf("keys[%d] = %s\n", k,keys[k]);
}
输出如下:
keys[0] = 000110110000001011101111111111000111000001110010çVTz¸ä
keys[1] = 011110011010111011011001110110111100100111100101çVTz¸ä
keys[2] = 010101011111110010001010010000101100111110011001çVTz¸ä
keys[3] = 011100101010110111010110110110110011010100011101çVTz¸ä
keys[4] = 011111001110110000000111111010110101001110101000çVTz¸ä
keys[5] = 011000111010010100111110010100000111101100101111çVTz¸ä
知道我在这里做错了吗?我应该在分配给阵列之前分配内存吗?
答案 0 :(得分:4)
keyi
似乎很可能不是NUL终止的。
也许你想要这个?
keyi[48] = 0; /* Caveat, keyi must be at least 49 chars wide. */
keys[i] = keyi;
或者也许:
printf("keys[%d] = %.48s\n", k,keys[k]);
答案 1 :(得分:2)
%s
打印内容,直到遇到\0
,您的元素未被\0
终止。
因此它打印出内容,直到它随机遇到\0
。
您应明确\0
终止您的内容。
答案 2 :(得分:1)
您应该在48个字符串的末尾写一个0
字节,否则它将不知道何时停止打印。请确保分配49个字节以允许此操作。
答案 3 :(得分:1)
您的char*
s不指向以NULL结尾的字符串。您需要将keyi
长49个字节,并将{0}置于keyi[48]
。