字符串指针数组

在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]); } 

它不工作请给我答案……

问题是您没有为这些名称分配任何空间。 如果要将其与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] ); 

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

在你的代码names是一个由6个指针组成的数组。 现在,每个指针都可以存储新字符串的起始点(第一个字符的地址)。 这意味着您可以在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连续char地址块,每个地址都由names[i]引用。 当你执行scanf()它会从标准输入中读取字节,然后将这些字节放入由名称[1]引用的内存中的这些分配字节中。

我在开始时很难理解这一切,所以只是想一个精心的解释会有所帮助。 🙂