C:打印char数组*的问题

时间:2012-02-18 17:05:46

标签: c arrays

我有一个像这样初始化的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¸ä

知道我在这里做错了吗?我应该在分配给阵列之前分配内存吗?

4 个答案:

答案 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]