拳头,sizeof(char)总是 1,你不需要乘以它。
其次,当你为一个字符串分配空间时,你必须使用:
malloc (strlen (string) + 1);
换句话说,你需要在结尾处为空字节留出空间。
第三,您似乎对字符指针和字符指针 指针感到困惑。 stored_ 是单个字符块,stored_[1] 仅比 stored_[0] 多一个字节,这意味着您将没有足够的空间来存储字符串。
stored_[n], n=: 0 1 2 3
+---+---+---+---+
| | | | |...
+---+---+---+---+
each of these cells is a single byte.
您要么必须自己管理单个字符块,为每个元素留出足够的空间(通过使用稀疏索引),要么拥有索引为 0、1、2 等的字符指针块,但是您'然后必须单独管理字符串分配。
下面的代码展示了如何做到这一点:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (void) {
// An array of char pointers (C strings).
char **stored_ = NULL;
char testMessage[15];
int i;
// Populate them.
for (i = 0; i < 10; i++) {
sprintf (testMessage,"Message::%i",i);
printf ("string is:%s;length is %i\n",testMessage,strlen(testMessage));
// Reallocate array of char *, allocate room for string, then store it.
stored_ = realloc (stored_,sizeof (char*) * (i + 1));
stored_[i] = malloc (strlen (testMessage) + 1);
strcpy (stored_[i], testMessage);
}
这就是它的核心,字符指针数组的分配与构成 C 字符串的实际字符数组分开。
然后下面的代码将它们打印出来并进行清理。
// Print them.
for (i = 0; i < 10; i++) {
printf("inside:|%s|\n",stored_[i]);
}
// Free all memory and return.
for (i = 0; i < 10; i++) {
free (stored_[i]);
}
free (stored_);
return 0;
}
如预期的那样输出:
string is:Message::0;length is 10
string is:Message::1;length is 10
string is:Message::2;length is 10
string is:Message::3;length is 10
string is:Message::4;length is 10
string is:Message::5;length is 10
string is:Message::6;length is 10
string is:Message::7;length is 10
string is:Message::8;length is 10
string is:Message::9;length is 10
inside:|Message::0|
inside:|Message::1|
inside:|Message::2|
inside:|Message::3|
inside:|Message::4|
inside:|Message::5|
inside:|Message::6|
inside:|Message::7|
inside:|Message::8|
inside:|Message::9|
使用这种方法,每个单元格都是一个指向字符数组的指针,单独分配(保存 C 字符串):
stored_[n], n=: 0 1 2 3
+---+---+---+---+
| | | | |...
+---+---+---+---+
| | | | +----------------------+
| | | +---> | character array here |
| | | +----------------------+
| | | +----------------------+
| | +-------> | character array here |
| | +----------------------+
| | +----------------------+
| +-----------> | character array here |
| +----------------------+
| +----------------------+
+---------------> | character array here |
+----------------------+