接收C套接字数据分配二维数组

Recieving C socket data to allocated 2D array

我正在尝试用从套接字接收到的数据填充我分配的数组,但无法使其正常工作。当我通过以下方式定义和获取数据时:

uint16_t data[2048];
recv(network_socket, &data, sizeof(data), 0);

数据已正确接收,但当我尝试通过分配的数组接收数据时:

int i;
int N = 3;
int M = 2048;
int **matrix; 

matrix = (int **)calloc(N, sizeof(int *));

for (i=0; i<N; i++) {
    matrix[i] = (int *)calloc(M, sizeof(uint16_t));
}

for (i=0; i<N; i++) {
    recv(network_socket, matrix[i], sizeof(data), 0);
}

我感觉到最后一部分出了问题。据我了解,最后的 matrix[i] 获取指向行首的指针 i 并且应该适用于 recv() 但这可能是我在这里出错的地方。

编辑:当我尝试 printf("Number: %" PRIu16 "\n", matrix[a][b]); 时,我在第二部分得到了一些巨大的数字,wheras printf("Number: %" PRIu16 "\n", data[a]);第一个工作正常。

评论和其他答案指出了一些关于 type 一致性的潜在问题(建议使用 intuint16_t,但不要混合)和分配内存.

关于内存创建的建议:
为了简单和可读性,特别是当希望模拟数组的多个维度时,考虑将内存创建封装到一个函数中。例如:

uint16_t ** Create2D(int c, int r)
{   
    uint16_t **arr;
    int    y;

    arr   = calloc(c, sizeof(uint16_t *));
    for(y=0;y<c;y++)
    {
        arr[y] = calloc(r, sizeof(uint16_t));   
    }
    return arr;
}

像这样调用函数:

uint16_t ** matrix = Create2D(N, M);
if(matrix)//always good to check return of [c][m]alloc before using
{
    // Use allocated memory
    ...

备注:

  • 此示例创建二维矩阵,而是模拟 一。 (描述的很详细)它实际上只是一个指向指针集合的指针,每个指针指向分配的内存这样它们的内容就可以使用行-列表示法访问,就好像它被创建为:

uint16_t array[N][M];

  • 在 C 中,it is not necessary to cast the return of malloc or calloc
  • [m][c]alloc()个调用,必然有一个对应的调用 至 free().

释放这块内存也可以用封装的形式实现。例如:

void free2D(uint16_t **arr, int c)
{
    int i;
    for(i=0;i<c;i++)
    {
        free(arr[i]);
    }
    free(arr);
}  

您在第一个代码中告诉您需要一个 16 位无符号整数数组并接收它们。一切都很好。

在您的第二个代码中,您需要一个 int 的数组,这在您的平台上可能不是 16 位的。然后根据它们是 16 位值为它们分配一定数量的内存,并读取未公开数量的数据。

然后您尝试以 ints 的形式访问它们,如果您的系统是 32 位,这显然会导致两个 uint16_t 值合并为一个 int,或者在 64 位系统上什至是四个系统。

修复您的代码以像第一个那样使用 uint16_t,它实际上会知道如何处理 16 位数据。您当前的代码甚至会出现未定义的行为,因为您尝试访问分配范围之外的内存。

int **matrix; 

matrix = (int **)calloc(N, sizeof(int *));
...

代码不起作用,因为上面不是二维数组,而是分段的、基于指针的查找 table。因此,它与数组没有丝毫兼容。

您没有理由需要在此处进行这样的查找 table。问题可能源于对如何 .

的困惑