【问题标题】:C function does not return the correct array size [duplicate]C函数不返回正确的数组大小[重复]
【发布时间】:2021-01-02 21:52:46
【问题描述】:

我在 C 中定义了一个函数如下:

int *face_2_cells(int boundary_field_id) {
int b_cells_field[4];
if(boundary_field_id==1)
{
  b_cells_field[0]=1;
  b_cells_field[1]=2;
  b_cells_field[2]=3;
  b_cells_field[3]=4;
}
else{
  b_cells_field[0]=0;
  b_cells_field[1]=0;
  b_cells_field[2]=0;
  b_cells_field[3]=0;
}
return b_cells_field;
}

然后我在另一个函数中调用了这个函数,然后打印出数组的大小,如下所示:

void
cs_user_extra_operations()
{
  {                                                                                                                               
    int *face_22_cells = face_2_cells(1);
    printf("\n SIZE = %i""  ", sizeof(face_22_cells)/sizeof(face_22_cells[0]));
}
}

但代码输出 SIZE = 2,而 SIZE 的正确值是 4。 问题出在哪里?

【问题讨论】:

  • 您的函数还返回一个指向不再存在的数组的指针,因此在上一个副本之上,您的代码也被破坏了
  • sizeof(face_22_cells) 返回指针的大小,而不是它所指向的大小。所以如果你有一个 64 位指针(大小 8)和 /sizeof(int) (4) 你得到 2。
  • 您在这里遇到的另一个问题(与问题无关)是您返回对本地数组的引用,当您退出函数时该数组不再存在。

标签: arrays c


【解决方案1】:

sizeof 返回你给它的元素的大小,在 face_22_cells 的情况下,它是一个指针,是 8 个字节(64 位架构)。在大多数架构上,int 的大小为 4 字节(32 位)。

所以你的代码总是评估为8/4 = 2

我认为在像这样在静态声明的数组上使用sizeof 时,您会将其与计算长度混淆:

int array[32];
int length_of_array = sizeof(array)/sizeof(int);

但是请记住,尽管数组指针,但指针不是数组(如果你想学究气Arrays are Not Pointers)。

虽然sizeof(array) 将是32*4 = 128,但sizeof(int*) 始终为8(在64 位机器上)

【讨论】:

  • 谢谢。但是,当我想将其中一个指针值打印为: printf("\n face2 = %i"" ", face_22_cells[0]);我收到 SIGSEGV 信号错误!
  • ...或sizeof(array)/sizeof(array[0]);
  • 您的代码更重要的问题是您正在返回一个指向本地数组的指针。当您调用face_2_cells 函数时,它会在堆栈上分配一个数组b_cells_field 并返回一个指向它的指针。但是,一旦它返回,堆栈就会被弹出并且指针变得无效......您永远不能返回指向本地数组的指针,除非它是静态的!稍后使用mallocfree 动态分配它,或者将缓冲区作为输入参数提供给您的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2018-03-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多