C 字符串指针数组

C 字符串指针数组,c,arrays,C,Arrays,在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<

在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]);
 }
intmain()
{
字符*名称[6];
内环;

对于(loop=0;loop,问题在于您没有为这些名称分配任何空间。如果要将数组中的每个元素与
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] );
char*名称[6];
对于(int i=0;i<6;++i)
名称[i]=malloc(256*sizeof*names[i]);//或其他一些最大值
scanf(“%s”,名称[1]);

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

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

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

因此,要做到这一点,必须为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] );
char*名称[6];
int max_length=256;//预期的最大长度
对于(int i=0;i<6;++i)
names[i]=malloc(max_length*sizeof(char));//分配最大长度字节数
scanf(“%s”,名称[1]);
所以现在你基本上有了6个不同的
max_length
连续字符地址块,每个地址块都由
names[i]
引用。当你执行
scanf()
时,它从标准输入读取字节,然后将其放入内存中按名称[1]引用的分配字节中


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

回答很好,K-ballo。虽然原始代码只是一个非常简单的示例,但始终建议检查malloc返回的NULL以捕获内存不足的条件:if((names[I]=malloc(256*sizeof(char))=NULL){fprintf(stderr,“分配错误!\n”);exit(1)}。
sizeof*names[0]
在这里会比
sizeof(char)
更好吗?这样它跟踪实际类型,就少了一次忽略内容的机会。特别是因为
sizeof(char)
是1。@jthill总是鼓励使用
p=malloc(sizeof*p)
您想要的是整个lhs表达式,而不是一些中间指针,而不是
p=malloc(sizeof(T))
s/b
*names[i]