指针数组的问题

时间:2014-09-12 03:38:12

标签: c arrays pointers

我有一个入门级C指针问题...假设我有两个字符串,我想打印它们。我在下面的代码中误解了什么?

void print_array(char **array[]) {
    int i = 0;
    while((*array)[i] != NULL) {
        printf("%s\n", (*array)[i++]);
    }
    return;
}

int main(int argc, char** argv) {
    char str1[] = "hello";
    char str2[] = "world";
    char **array = {str1, str2};

    print_array(&array);
    return (EXIT_SUCCESS);
}

要使我的代码正常工作,我需要访问print_array

中的数组

4 个答案:

答案 0 :(得分:3)

另一种看法(更多重构)。

错误修正:

  • 纠正混淆应该取消引用的内容以及print_array中的内容(不要追求三星级编程,除非你必须这样做)
  • 将缺少的sentinel-0添加到从main传递到print_array
  • 的数组中

其他变化:

  • 删除了多余的return - 语句(main最后有一个隐含的return 0;
  • 删除了对0 / NULL
  • 不平等的多余检查
  • print_array
  • 中删除了一个间接级别
  • 在适当的const中使用print_array
  • print_array
  • 中消除了反变量
  • main(需要C99)
  • 中使用了常量复合文字
#include <stdio.h>

void print_array(const char *const array[]) {
    while(*array)
        printf("%s\n", *array++);
}

int main() {
    print_array((const char*[]){"hello", "world", 0});
}

See here on coliru


撤消清除步骤,更改print_array的签名:

#include <stdio.h>

void print_array(char **array[]) {
    for(char** p = *array; *p; p++)
        printf("%s\n", *p);
}

int main() {
    print_array(&(char**){(char*[]){"hello", "world", 0}});
}

Live on coliru

答案 1 :(得分:2)

*中有print_arrayvoid print_array(char *array[]) { int i = 0; while(array[i] != NULL) { printf("%s\n", array[i++]); } } 太多了。它应该是这样的:

char **array

这使得称之为直截了当。将char *array[]更改为NULL。并且不要忘记在数组的末尾添加int main(int argc, char** argv) { char str1[] = "hello"; char str2[] = "world"; char *array[] = {str1, str2, NULL}; print_array(array); return EXIT_SUCCESS; } 条目。

print_array

另一方面,如果您不应该修改array,那就太烦人了。您需要另一个变量才能暂时保留char *array[] = {str1, str2, NULL}; char **p = array; print_array(&p); 的地址。

*

这就是为什么我说print_array中有{{1}}个太多{/ 1}}。

答案 2 :(得分:1)

由于您正在处理数组,请将数组成员的数量传递给print_array。上面的代码是UB。

修复您的代码:

void print_array(char *arr[], int cnt) {
    int i = 0;
    for(i = 0; i < cnt; i++) {
        printf("%s\n", arr[i]);
    }
    return;
}

int main(int argc, char** argv) {
    char str1[] = "hello";
    char str2[] = "world";
    char *arr[] = {str1, str2};

    print_array(arr, 2);
    return (0);
}

答案 3 :(得分:0)

另一种方式:

#include <stdio.h>
void print_array(char *array[]) {
   int i = 0;
   while (array[i] != 0) {
   printf("%s\n", array[i++]);
}
return;
}

int main(int argc, char** argv) {
    char str1[] = "hello";
    char str2[] = "world";
    char *array[] = {str1, str2, 0};

    print_array(array);
    return 0;
}