[英]How to pass a 1D array of 500 pointers to a function in C
程序编译正常,但是一旦用户向数组输入内容,它就会崩溃。 任何帮助将不胜感激 :)
#include <stdio.h>
#include <stdlib.h>
void Register(char *arr[],char arr2[]);
int main() {
char *Username[500];
char table1[20];
Register(Username,table1);
return 0;
}
void Register(char *Username[],char table1[]){
int i;
for(i = 0; i < 500; i++){
scanf("%s",&table1);
Username[i] = table1;
printf("for i = %d username[%d] is %s\n\n",i,i,Username[i]);
}
}
问题在于,当您传递数组时,它们会衰减为指向其第一个元素的指针。 对于“数组”参数,例如char table1[]
实际上是char *table1
。 当您尝试在scanf
使用地址运算符&
时,这是一个问题。
当您在scanf
调用中使用&table1
,您会得到一个指向指针的指针,该指针的类型为char **
,而不是预期的char *
。 格式%s
和预期类型之间的这种不匹配会导致未定义的行为,并可能导致您的崩溃。
解决此崩溃的方法是永远不要使用 address-of 运算符来读取字符串(例如%s
格式),因为当您拥有实际数组时,它甚至是错误的:
scanf("%s",table1);
至于让Username
所有元素都指向table1
的单个字符串的问题,我建议您使用Username
的数组数组代替:
char Username[500][20];
该数组衰减为指向数组的指针,其类型为char (*)[20]
,它需要成为Register
函数声明的一部分:
void Register(char (*Username)[20]);
然后你可以直接在调用scanf
使用它:
scanf("%19s", Username[i]);
还要注意我如何限制输入字符串的长度,所以你不能读取超过数组可以处理的内容(它是 19,因为数组也需要适合字符串空终止符)。
在这份声明中
scanf("%s",&table1);
不是将字符串读入指针 table1 指向的数组中,而是将字符串读入指针本身。
你必须写
scanf("%s",table1);
此外,函数Register
也没有多大意义,因为数组Username
所有元素都将指向数组 table1 的第一个字符。 也就是说,数组的所有元素都将指向读取的最后一个字符串的第一个字符。
您需要动态分配内存。 该函数的第二个参数也是多余的。
功能凸轮如下所示
size_t Register( char *Username[], size_t n )
{
char record[20];
int i = 0;
for ( ; i < n && scanf( "%19s", record ) == 1; i++ )
{
Username[i] = malloc( strlen( record ) + 1 );
strcpy( Username[i], record );
printf( "for i = %zu username[%zu] is %s\n\n", i, i, Username[i] );
}
return i;
}
在 main 函数中可以像这样调用
size_t n = Register( Username, 500 );
\\当然,您需要释放所有分配的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.