【问题标题】:C split pointer array and save in new varC拆分指针数组并保存在新的var中
【发布时间】:2018-02-27 02:54:20
【问题描述】:

我正忙于将二维指针数组的结果拆分并保存在另一个较小的二维指针数组中。但是,我无法正常工作;只有第一行匹配。有人可以帮助我或告诉我我做错了什么吗?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <sys/time.h>

void print_grid(bool *grid, int n, int m){
    int i, j;
    for (i = 0; i < n; i++){
        for (j = 0; j < m; j++){
            printf("%d ", (bool)*((grid+i*n) + j));
        }        
        printf("\n"); 
    }   
}

void generate_random_values_grid(bool *grid, int n, int m){
    int i, j;    
    for (i = 0; i<n; i++){    
        for (j = 0; j<m; j++){
            int rndm = (rand() %2);  
            *((grid+i*n) + j) = rndm;     
        }
    }
}

int main(int argc, char *argv[])
{
    int n=7;
    int m=5;      
    int num_procs = 3;
    int division = 2;

    bool *grid = (bool *)malloc(n*m*sizeof(bool));
    srand(time(NULL)); 
    generate_random_values_grid((bool *)grid, n, m);
    print_grid((bool *)grid, n, m);

    //Split
    printf("----Split with division: %d ---------\n", division);
    bool *division_grid = (bool *)malloc(division*m*sizeof(bool));
    memcpy((bool *)division_grid, (bool *)grid, (division*m*sizeof(bool)));
    print_grid((bool *)division_grid, division, m);   

    return 0;
}

【问题讨论】:

  • *((grid+i*n) + j) = rndm; 不应该是*((grid+i*m) + j) = rndm;
  • 是的,没错,哈哈!感谢您的来信。
  • 问题已解决。线程可以关闭大声笑。谢谢@Jean-FrançoisFabre

标签: c pointers variables multidimensional-array split


【解决方案1】:

双循环都错了:

for (i = 0; i<n; i++){    
    for (j = 0; j<m; j++){
        int rndm = (rand() %2);  
        *((grid+i*n) + j) = rndm;     
    }

从 2 个索引计算一维索引是错误的

除非m == n,否则您将i 乘以n,因此当i == n-1 时,您会得到n*(n-1) 的偏移量。所以问你这个问题:如果m = 1n = 10000 怎么办?

正确的公式是:

*((grid+i*m) + j) = rndm;     

一些更好的方法是:

  • 将行偏移量预计算为行指针:bool *row = grid+i*m 然后进入循环,使用row[j] 访问元素
  • 在主例程中使用实数、可变长度数组代替mallocbool grid[n][m];nm 之后已确定)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多