在下面的示例中,如果我取消注释匹配[1]的打印并且匹配print_and_modify函数中的[2]则失败(非法指令:我的Mac OS X小牛上的4)。
令我困惑的是为什么匹配[0]工作正常?非常感谢任何帮助。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_and_modify(char ***matches) {
printf("%s\n", *matches[0]);
/* printf("%s\n", *matches[1]); */
/* printf("%s", *matches[2]); */
}
int main(int argc, char **argv)
{
char **matches;
matches = malloc(3 * sizeof(char*));
matches[0] = malloc(10 * sizeof(char));
matches[1] = malloc(10 * sizeof(char));
matches[2] = malloc(10 * sizeof(char));
char *test1 = "test1";
char *test2 = "test2";
char *test3 = "test3";
strncpy(matches[0],test1,5);
strncpy(matches[1],test2,5);
strncpy(matches[2],test3,5);
print_and_modify(&matches);
printf("======\n");
printf("%s\n", matches[0]);
printf("%s\n", matches[1]);
printf("%s\n", matches[2]);
}
请原谅人为的例子。我正在尝试学习一些C.
答案 0 :(得分:1)
它是运算符优先级:[]
的优先级高于*
,因此您需要强制所需的优先级:
void print_and_modify(char ***matches) {
printf("%s\n", (*matches)[0]);
printf("%s\n", (*matches)[1]);
printf("%s", (*matches)[2]);
}
请注意,除非您希望修改已分配的数组,否则不需要传递三重指针。如果传递双指针,则可以修改单个字符串的内容,还可以通过取消分配或重新分配char数组来将字符串替换为其他字符串。