我有以下有效的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int pw = sizeof(char*);     // width of pointer (to char)
int num;
int first = 1;
int size = 0;
int incr = 10;
char *(*arr)[];     // pointer to array of pointers to char */
test(char* s, int i)
{
  int j;
  char *(*newarr)[];        // pointer to array of pointers to char
  if (first) {          // first time
    arr = malloc(pw*incr);  // malloc array
    first = 0;          // skip from now on
    size = incr;        // save the size
  }
  if (i >= size) {          // out of space
    newarr = malloc(pw*(size+incr));    // get incr bigger space
    for (j=0; j<size; j++)      // copy the elements from the old
      (*newarr)[j] = (*arr)[j];     // array to new array
    free(arr);                  // free the old array space
    arr = newarr;           // point old array to new array
    size = size+incr;
  };
  int len = strlen(s);      // length of s
  (*arr)[i] = malloc(len+1);    // assign pointer to pointer array element
  strcpy((*arr)[i], s);     // copy s to array
                    // both arguments must be pointers
  printf("%d\t%s\n", i, (*arr)[i]);
};
main() 
{
  char* s = "this is a string";
  for (num=0; num<30; num++)    // add 30 pointers to s to *arr
    test(s, num);
  for (num=0; num<30; num++)
    printf("%d\t%s\n", num, (*arr)[num]); // print out what they point to
};
它从 0 到 29 两次打印出 'i\tthis is a string' for 'i'。我想要做的是从文件顶部传递'arr'作为'test'的参数。我想这样做的原因是因为我想传递几个不同的数组,所有这些数组都以相同的方式声明。如果我做出最小的改变,我会得到:
0   this is a string
Segmentation fault (core dumped)
这是 diff 命令的输出,显示了最小的更改:
    13c13
< char *(*arr)[];       // pointer to array of pointers to char */
---
> char *(*jarr)[];      // pointer to array of pointers to char */
15c15
< test(char* s, int i)
---
> test(char* s, int i, char *(*arr)[])
52c52
<     test(s, num);
---
>     test(s, num, jarr);
54,55d53
<   for (num=0; num<30; num++)
<     printf("%d\t%s\n", num, (*arr)[num]); // print out what they point to
换句话说,除了将“arr”重命名为“jarr”并将其传递给“test”之外,一切都是一样的。
在此先感谢,迈克