【问题标题】:calculating length of array gives weird results [duplicate]计算数组的长度会产生奇怪的结果[重复]
【发布时间】:2013-06-18 11:57:18
【问题描述】:

我正在尝试找出数组的长度,但我得到了奇怪的数字……

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

const int numOfCoordinates = 100;

typedef struct {
    int x;
    int y;
    int counter;
} Coordinate;

Coordinate *coordinatesMainArray;
Coordinate endPoint;
Coordinate startPoint;


int main(int argc, const char * argv[])
{
    endPoint.x = 8;
    endPoint.y = 3;
    endPoint.counter = 0;

    startPoint.x = 1;
    startPoint.y = 4;

    coordinatesMainArray = malloc(sizeof(Coordinate) * 1);
    coordinatesMainArray[0] = endPoint;



    int a = sizeof(coordinatesMainArray);
    int b = sizeof(coordinatesMainArray[0]);
    int coordinatesMainArrayLength = (a / b);

这是我的代码,直到我需要坐标主数组的长度为止。 但我得到 a = 8 和 b = 12。

我假设我会得到两个相似的大小,所以它表明我的数组中有一个元素。

我做错了什么?

【问题讨论】:

  • 我认为教程中没有关于 sizeof 运算符的章节,是吗... >.

标签: c


【解决方案1】:

sizeof(coordinatesMainArray) 为您提供coordinatesMainArray 变量的大小 - Coordinate*

sizeof(coordinatesMainArray[0]) 为您提供coordinatesMainArray 数组中第一个元素的大小 - Coordinate 实例。 sizeof(*coordinatesMainArray) 相当于这个。

顺便说一句,没有办法使用指针来确定数组的大小。您需要单独存储数组大小,并将其以及数组指针传递给其他函数,或者保证数组以已知的终止符值结尾(例如NULL

【讨论】:

    【解决方案2】:

    在这种情况下,sizeof 将只返回 coordinatesMainArray 指针的大小(不管其内容的大小),因为它是在运行时分配的。

    【讨论】:

      【解决方案3】:

      sizeof(coordinatesMainArray) 给你sizeof(Coordinate *)sizeof(coordinatesMainArray[0]) 给你sizeof(Coordinate)

      第一个是 sizeof 指针,第二个是 sizeof 数组元素。

      【讨论】:

        【解决方案4】:

        当您使用malloc 分配内存时,它不会保持已分配块的大小。至少您的常规代码无法访问。如果分配内存,则必须自己跟踪大小。

        在您的示例中,您刚刚获得了指针的大小 (a) 和单个结构的大小 (b)。

        【讨论】:

          猜你喜欢
          • 2012-01-05
          • 1970-01-01
          • 2013-03-15
          • 2020-07-17
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 2012-03-05
          • 2015-10-04
          相关资源
          最近更新 更多