【问题标题】:Structure issue C (Declaration)结构问题 C(声明)
【发布时间】:2021-12-03 05:12:07
【问题描述】:

假设我们有

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
    int CNE;
}etudiant;
etudiant saisie(){
    etudiant T[5];
    int i,j;
    for(i = 0;i<5;i++){
        
        printf("Le CNE : ");
        scanf("%d",T[i].CNE);
        
    }
    return T;
}
int main(){
    etudiant e = saisie();
    return 0;
}

我想有 100 个学生,所以我不能声明 100 个学生,然后把他们的 CNE 设置好? 那么声明它们的简单方法是什么

【问题讨论】:

  • return T[5]; 是什么意思?这将尝试从 T 返回第 6 个学生(因为数组索引从 0 开始),这是一个由 5 个学生组成的数组。
  • “不工作”是什么意思?如果您没有提供足够的详细信息,我们将无法帮助您
  • @ForceBru 如果我返回 T,它不会运行代码
  • 您不能返回已声明为局部变量的数组。要么声明它是全局的,要么使用 malloc。
  • @user14655248,是的,但是您正在尝试返回不存在的东西。由于您需要在函数内分配数组,因此您不能只返回T,因为它将在函数退出时被销毁。您应该研究动态内存分配和malloc 函数。

标签: arrays c declaration return-type function-definition


【解决方案1】:

为了让你的程序有意义,它应该被重写,例如下面的方式

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int CNE;
}etudiant;

void saisie( etudiant *e, size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        printf("Le CNE : ");
        scanf("%d", &e[i].CNE);
    }
}

int main( void )
{
    enum { N = 5 };
    etudiant e[N];

    saisie( e, N );

    return 0;
}

至于你的程序,那么至少函数返回类型是无效的

etudiant saisie();

因为该函数返回一个数组,该数组被隐式转换为指向其第一个元素的指针。

所以你至少需要像这样声明它

etudiant * saisie();

但另一方面,您可能不会返回具有自动存储持续时间的本地数组,因为退出函数后它不会处于活动状态。所以返回的指针是无效的。

如果你想在函数中创建一个数组并将它返回给调用者,你需要动态分配它,例如

etudiant *e = malloc( 5 * sizeof( etudiant ) );

或在本次通话中

scanf("%d",T[i].CNE)

你需要使用指向数据成员 CNE 的指针

scanf("%d", &T[i].CNE)

【讨论】:

    【解决方案2】:

    一个问题是函数的返回类型与您尝试返回的表达式的类型不匹配:

    etudiant saisie(){
      etudiant T[5];  
      ...
      return T;
    }
    

    表达式 T 的类型为etudiant [5],在这种情况下“衰减”为类型edutiant *etudiant *etudiant 的类型不同。

    第二个问题是 C 函数不能返回 数组。你不能声明一个 C 函数来返回一个数组类型,并且由于当你尝试返回一个数组表达式时的衰减规则,所有返回的是一个指向数组第一个元素的指针 - 不幸的是,一旦数组不再存在函数返回。

    如果要声明 100 个学生,只需在 main 中声明一个 etudiant 数组即可:

    #define NUM_STUDENTS 100
    ...
    etudiant arr[NUM_STUDENTS];
    

    如果您希望函数修改或初始化数组,请将数组(连同其大小!)作为参数传递给函数:

    void saisie( etudiant *arr, size_t arrSize )
    {
      for ( size_t i = 0; i < arrSize; i++ )
      {
        printf( "Le CNE: " );
        scanf( "%d", &arr[i].CNE );
      }
    }
    

    您会从main 拨打电话

    saisie( arr, 100 ); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多