如何将一个字符串数组传递给函数?

时间:2017-03-22 12:33:45

标签: c

有人可以告诉我为什么两个印刷品的输出都不相同?如何将一个字符串数组传递给函数呢?

main()
{
    char b[10][10];
    printf("%p, %p, %p\n", b, b[0], b[9]);
    getStrListFromString(b);
}

void getStrListFromString(char **strList)
{
    printf("%p, %p, %p\n", strList, strList[0], strList[9]);
}

预期输出:

0x7fffbe4ecf00, 0x7fffbe4ecf00, 0x7fffbe4ecf5a
0x7fffbe4ecf00, 0x7fffbe4ecf00, 0x7fffbe4ecf5a

实际输出:

0x7fffbe4ecf00, 0x7fffbe4ecf00, 0x7fffbe4ecf5a
0x7fffbe4ecf00, 0x7fffbe4ecf80, (nil)

2 个答案:

答案 0 :(得分:3)

您的函数需要char **,但您传递char [10][10]。这些都不一样。

传递给函数的数组衰减为指向第一个元素的指针。因此,当您将char [10][10](大小为char [10]的数组10)传递给函数时,它会衰减为char (*)[10](指向char [10]的指针。

将您的功能更改为接受char [10][10]char (*)[10]

答案 1 :(得分:2)

除了关于指针指向与多维数组完全无关的核心问题外,你还有其他各种错误:

main() // obsolete form of main(), won't compile unless C90
{
    char b[10][10]; // uninitialized
    printf("%p, %p, %p\n", b, b[0], b[9]); // should be void pointers
    getStrListFromString(b); // wrong type of parameter
    // return statement necessary here in C90
}

void getStrListFromString(char **strList) // should not be pointer-to-pointer
{
    printf("%p, %p, %p\n", strList, strList[0], strList[9]); // same issue as in main
}

此代码编译意味着您的编译器是完全废话或配置不正确。你需要尽快解决这个问题。

更正后的代码:

#include <stdio.h>

void getStrListFromString(char strList[10][10])
{
    printf("%p, %p, %p\n", (void*)strList, (void*)strList[0], (void*)strList[9]);
}

int main (void)
{
    char b[10][10];
    printf("%p, %p, %p\n", (void*)b, (void*)b[0], (void*)b[9]);
    getStrListFromString(b);
}