好的,你可以看到我有问题。我正在尝试使用名为tab_string的函数在C中创建一个字符串数组。如果您尝试运行以下代码,您将看到我的测试编号为2的段错误,我不知道为什么因为第一次测试工作。提前致谢
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NB_STRING 2
void create_tab_string(char chaine[], char*** p_tab_string) {
char test[] = "Hey";
char test2[] = "blabla";
// Allocation
*p_tab_string = (char **)(malloc(NB_STRING*sizeof(char*)));
// Test
*p_tab_string[0] = test;
printf("%s \n", *p_tab_string[0]);
// Test 2 ERROR ?????
*p_tab_string[1] = test2;
printf("I have the second string \n");
printf("%s \n", *p_tab_string[1]);
}
int main() {
int i;
char string_test[] = "I am a test";
char **tab_string;
create_tab_string(string_test, &tab_string);
for(i = 0; i < NB_STRING; i++)
printf("%s \n", tab_string[i]);
return 0;
}
答案 0 :(得分:0)
你的功能应该是
void create_tab_string(char chaine[], char*** p_tab_string) {
char *test = "Hey";
char *test2= "blabla";
// Allocation
*p_tab_string = malloc(NB_STRING*sizeof(char*));
// Test
(*p_tab_string)[0] = test;
printf("%s \n", (*p_tab_string)[0]);
(*p_tab_string)[1] = test2;
printf("I have the second string \n");
printf("%s \n", (*p_tab_string)[1]);
}
首先,测试c-strings(数组)的地址是函数本地的,不能在外部访问。 正如您所看到的,我将它们更改为字符串文字的简单指针,因此可以在函数外部访问字符串文字。
第二件事是您解除引用指针的方式。
使用*p_tab_string[1]
您解除引用不存在的p_tab_string
的第二项。
使用(*p_tab_string)[1]
您可以取消引用*p_tab_string
指向的第二项内容,即tab_string
声明为main
答案 1 :(得分:0)
您遇到运营商优先权问题。
您需要使用:
(*p_tab_string)[1]
而不是*p_tab_string[1]
。
此外,正如注释中所写,您的测试字符串是本地函数,在函数范围之外不可用。您需要复制它们或使用指针。