4

在 C 编程中,我们无法使用 scanf() 函数获取指针数组的值,但是

int main()
{
char *names[6];
int loop;
scanf("%s",names[1]);
printftf("\n%s",names[1]);
}

它正在工作,当我将输入作为程序提供时,我认为它正在存储输入,但它会将输出正确打印为给定的输入。之后它给出了分段错误......但是当我在循环中做同样的事情时获得 6 个字符

int main()
{
 char *names[6];
 int loop;
 for(loop=0;loop<6;loop++)
 scanf("%s",names[1]);
 for(loop=0;loop<6;loop++)
 printf("\n%s",names[1]);
 }

它不起作用,请给我答案...

4

2 回答 2

11

问题是您没有为这些名称分配任何空间。如果您打算将数组中的每个元素与scanf.

char* names[6];
for( int i = 0; i < 6; ++i )
    names[i] = malloc( 256 * sizeof *names[i] ); // or some other max value

scanf( "%s", names[1] );

否则,这些指针将指向您内存中的任何位置,并且尝试读/写这些位置最终将导致分段错误

于 2012-12-31T05:14:47.077 回答
4

在您的代码names中是一个由 6 个指向 char 的指针组成的数组。现在这些指针中的每一个都可以存储新字符串的起始点(第一个字符的地址)。这意味着您可以在names变量中存储 6 个不同字符串的起始地址。

但是当您使用循环初始化这些字符串中的每一个时,您需要通知机器每个字符串可能有多长,以便它可以分配一个连续的地址块,然后可以将其第一个地址存储在您的指针中以引用您的细绳。因此,您必须分配一个您认为足以存储字符串的大小(例如:256 个字节,1 个字节为 1 个字符)。如果没有这个,机器不知道将字符串的所有字节存储在哪里,并且由于非法内存访问而引发分段错误。

因此,要做到这一点,必须为6 个指针中的每一个分配一些空间来存储字符串。这将在您的循环中使用malloc(). 基于@K-ballo 的代码:

char* names[6];
int max_length = 256; // The maximum length you expect
for( int i = 0; i < 6; ++i )
    names[i] = malloc( max_length * sizeof(char) ); // allocates max_length number of bytes

scanf( "%s", names[1] );

所以现在你基本上有 6 个不同的max_length连续字符地址块,每个块都由names[i]. 当您执行此操作时,scanf()它会从标准输入读取字节,然后将这些字节放入由名称 [1] 引用的内存中的这些分配字节中。

一开始我很难理解这一切,所以只是认为一个详尽的解释会有所帮助。:)

于 2012-12-31T05:57:54.493 回答