22

我正在尝试编写一个程序,该程序从文本文件中读取一系列字符串并将它们存储在字符串数组中,为每个元素动态分配内存。我的计划是使用指针将每个字符串存储在一个数组中,然后随着读取的更多内容增加数组大小。我无法理解为什么下面的测试代码不起作用。这是一个可行的想法吗?

char *aPtr;
aPtr =(char*)malloc(sizeof(char));

aPtr[0]="This is a test";


printf("%s",aPtr[0]);
4

4 回答 4

23

在 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.
于 2013-09-28T15:45:08.353 回答
10
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

在这里,您需要为 Number of pointers 分配内存,然后为每个指针分配内存。

str=malloc( sizeof(char *)*10);

然后循环遍历数组为每个指针分配内存

for(i=0;i<10;i++) 
str[i]=malloc(SIZE);
于 2013-09-28T16:01:52.943 回答
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);
}

...
于 2013-09-28T15:45:15.277 回答
-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]);
 }
于 2013-09-28T16:13:47.267 回答