繁体   English   中英

如何将包含 500 个指针的一维数组传递给 C 中的函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM