c-如何创建一个未知大小的字符串数组



我正在努力理解如何创建一个声明;字符串数组";其大小在声明时未知。这就是我目前所掌握的:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n, i;
char** words;
printf("How many strings you want to input? n");
scanf("%d", &n);
words = malloc(sizeof(char*) * n);
for (i = 0; i < n; i++) {
printf("Input your %d string: ", i + 1);
scanf("%s", words[i]);
}
for (i = 0; i < n; i++) {
printf("%sn", words[i]);
}
return 0;
}

程序正在编译,但我得到了一个Segmentation fault错误。

您只为指向字符串的指针分配内存,而不为字符串本身分配内存。试图在未分配的内存中存储字符串会调用未定义的行为。

指针就是指针。不能在其中存储字符串。您需要为指针应指向的位置保留内存。

#define STR_SIZE 100              // max length of a string (incl. null terminator)
printf("How many strings you want to input? n");
if (scanf("%d", &n) != 1)
{
fputs("Error at input", stderr);
// further error routine.
}
// allocate memory for the pointer to the strings.
words = malloc(sizeof(*words) * n);      
if (!words)
{
// error routine if the memory allocation failed.
perror("malloc"); 
exit(EXIT_FAILURE);    
}
// allocate memory for the strings themselves.
for (int i = 0; i < n; i++)
{
words[i] = malloc(sizeof(**words) * STR_SIZE);   
if (!words[i])
{
// error routine if the memory allocation failed.
perror("malloc"); 
exit(EXIT_FAILURE); 
}
}

旁注:

  • 如果分配发生错误,请始终检查内存管理函数的返回!输入操作(如scanf()(也是如此。

  • 请注意,在代码发生更改的情况下,使用sizeof(*words)sizeof(**words)而不是sizeof(char*)sizeof(char)更安全。

您没有为单个字符指针words[i]正确分配内存。

这很好-您为指向字符words:的指针分配了内存

words = malloc(sizeof(char*) * n);

但是,您还没有为那个words分配单独的指针。为此,您需要为单个单词提供多少缓冲区。举个例子,如果每个单词是100个字符,那么:

for (i = 0; i < n; i++)
{
printf("Input your %d string: ", i + 1);
words[i] = malloc(sizeof(char) * 100);  //<--
scanf("%s", words[i]);
}

还记得在完成后释放缓冲区。

for (int i=0; i<n; ++i) {
free(words[i]);
}
free(words);
return 0;

相关内容

  • 没有找到相关文章

最新更新