我正在尝试编写一个程序,该程序从文本文件中读取一系列字符串,并将这些字符串存储在一个字符串数组中,为每个元素动态分配内存。我的计划是使用指针将每个字符串存储在一个数组中,然后在读入更多数据时增大数组大小。我无法理解为什么我的测试代码无效。这是一个可行的想法吗?
char *aPtr;
aPtr =(char*)malloc(sizeof(char));
aPtr[0]="This is a test";
printf("%s",aPtr[0]);
答案 0 :(得分:19)
在C中,字符串是char*
。类型T
的动态数组表示为指向T
的指针,因此对于char*
char**
而言,不仅仅是char*
您声明的方式它
毫无疑问,编译器已发出一些警告。注意这些警告,通常它们可以帮助你理解要做什么。
以下是您开始测试的方法:
char **aPtr;
int len = 1; // Start with 1 string
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C
aPtr[0] = "This is a test";
printf("%s",aPtr[0]); // This should work now.
答案 1 :(得分:9)
char *str; //single pointer
这样你可以存储一个字符串。
要存储array of strings
,您需要two dimensional character array
或array of character pointers
或double pointer
char str[10][50]; //two dimensional character array
如果你这样声明你不需要分配内存,因为这是静态声明
char *str[10]; //array of pointers
这里需要为每个指针分配内存
循环遍历数组以为每个指针分配内存
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char **str; //double pointer
这里需要为指针数分配内存,然后为每个指针分配内存。
str=malloc( sizeof(char *)*10);
然后循环遍历数组为每个指针分配内存
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
答案 2 :(得分:5)
char * aPtr;
是指向一个字符的指针,您为此分配了内存以准确保存1
个字符。
做
aPrt[0] = "test";
您解决了此一个字符的内存,并尝试将文字"test"
的地址存储到其中。这将失败,因为这个地址最有可能比一个角色宽。
对代码的修复是为指向字符的指针分配内存。
char ** aPtr = malloc(sizeof(char *));
aPtr[0] = "test";
printf("%s", aPtr[0]);
更优雅,更强大的方法是分配相同的(以及添加强制性错误检查):
char ** aPtr = malloc(sizeof *aPtr);
if (NULL == aPtr)
{
perror("malloc() failed");
exit(EXIT_FAILURE);
}
...
答案 3 :(得分:-1)
你这样做完全错了。您的代码的正确版本应如下所示:
int main ()
{
char *aPtr;
aPtr =(char*)malloc(20*sizeof(char));
aPtr ="This is a test";
printf("%s",aPtr);
}
您可以使用指针数组。如果你想存储多个字符串。是的我知道使用for循环会很容易。但我试图以简单的方式解释,即使初学者也能理解。
int main ()
{
char *aPtr[10];
aPtr[0] =(char*)malloc(20*sizeof(char));
aPtr[0] ="This is a test";
aPtr[1] =(char*)malloc(20*sizeof(char));
aPtr[1] ="This is a test2";
printf("%s\n%s\n",aPtr[0],aPtr[1]);
}