如何将数组索引传递给c中的另一个函数

时间:2016-03-26 20:20:06

标签: c arrays

我试图弄清楚如何将数组索引传递给另一个函数。

我在这里:

 for(i=0; i<file_cnt; i++){

          iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&filenames[i]);
          printf("%s\n", filenames[i]);
        }

在函数get_checksum中,我最终需要文件名索引,但该函数中没有i

get_checksum函数中,

void* get_checksum(void* a){

            char *filename = (char *) a;
.....
}

我传递a作为与filenames[i]相关的字符指针。

但是,我需要稍后在函数中进行计算:get_checksum,它涉及获取和数组的索引。因此,我确实需要将filenames的索引转换为函数get_checksum

如何将数组索引传递给另一个函数?

2 个答案:

答案 0 :(得分:2)

通常你只传递2个参数,但你不能在这里因为pthread_create所以你将指针传递给堆分配的结构。

struct params {
    char *filename;
    int i;
};

/* ... */

for(i=0; i<file_cnt; i++){
      struct params *p = malloc(sizeof(struct params));
      p->filename = filenames[i];
      p->i = i;
      iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)p);
      if (iret1) {
          free(p);
          printf("OOPS %s\n", filenames[i]);
      } else {
          printf("%s\n", filenames[i]);
      }
    }

/* ... */

void* get_checksum(void* p){
    char *filename = ((struct params *)p)->filename;
    int i = ((struct params *)p)->i;
    free(p);
    /* ... */
}

答案 1 :(得分:2)

您可以定义一个结构来传递您需要的所有参数:

typedef struct params_s
{
    char * filename;
    int index;
    // additional params
} params_t;

然后创建静态或动态分配params_t类型的变量,初始化它并将其地址传递给get_checksum

示例

params_t params[NUM_OF_THREADS];
...
for(i=0; i<file_cnt; i++){
    params[i].filename = &filenames[i];
    params[i].index = i;
    iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&params[i]);
    printf("%s\n", filenames[i]);
}