将字符串传递到函数并在C中修改(指针有问题)

将字符串传递到函数并在C中修改(指针有问题),c,malloc,C,Malloc,我是C语言的新手,在指针方面有困难。我已经看过指南,并且(至少尝试过)遵循了他们的建议,但仍然无法让我的代码正常工作 我有司机。c: int main(int argc, char *argv[]) { char *prefix = "p", *suffix = "aa"; char *result; result = formResult(prefix, suffix); } 在helper.c中: char* formResult(char *prefix, char *su

我是C语言的新手,在指针方面有困难。我已经看过指南,并且(至少尝试过)遵循了他们的建议,但仍然无法让我的代码正常工作

我有司机。c:

int main(int argc, char *argv[]) {
  char *prefix = "p", *suffix = "aa";
  char *result;

  result = formResult(prefix, suffix);
}
在helper.c中:

char* formResult(char *prefix, char *suffix) {
  char *result = strcpy(result, prefix);
  result = strcat(result, suffix);
  return result;
}
当我接到这个电话时,我总是会遇到“分段错误(核心转储)”,但我不知道如何解决它。我试过使用带有前缀和后缀的malloc,但这也不起作用(尽管我可能做得不对)

谢谢

编辑: 我已将driver.c更新为

int main(int argc, char *argv[]) {
  char *prefix = malloc(15), *suffix = malloc(15);
  prefix = strcpy(prefix, "p");
  suffix = strcpy(suffix, "aa");
  char *result = malloc(30);

  printf("step0");
  result = formResult(prefix, suffix);
} 
char* formResult(char *prefix, char *suffix) {
  printf("step1");
  char *result =  malloc(strlen(prefix) + strlen(suffix) + 1);
  result = strcpy(result, prefix);
  result = strcat(result, suffix);
  return result;
}
和helper.c

int main(int argc, char *argv[]) {
  char *prefix = malloc(15), *suffix = malloc(15);
  prefix = strcpy(prefix, "p");
  suffix = strcpy(suffix, "aa");
  char *result = malloc(30);

  printf("step0");
  result = formResult(prefix, suffix);
} 
char* formResult(char *prefix, char *suffix) {
  printf("step1");
  char *result =  malloc(strlen(prefix) + strlen(suffix) + 1);
  result = strcpy(result, prefix);
  result = strcat(result, suffix);
  return result;
}

我可以让“step0”打印,但我仍然可以在没有“step1”打印的情况下获得内核转储。

如果在未分配的内存空间中写入,则应使用malloc分配它:

char *result = malloc(sizeof(*result) * (strlen(prefix) + strlen(suffix) + 1))
该行将显示未定义的行为。您尚未为
result
分配任何空间。让我们这样做:

char* formResult(char *prefix, char *suffix) {
  char *result = malloc(strlen(prefix) + strlen(suffix) + 1);
  strcpy(result, prefix);
  strcat(result, suffix);
  return result;
}

如果您使用的是
gcc
clang
,我建议您在命令行中添加编译器标志
-Wall

打开编译器警告。不要把人的注意力浪费在机器可以为你做的事情上。我想你的意思是
char*prefix=“p”、*suffix=“aa”。实际代码应该给出一个编译错误。不要忽略错误。使用鼠标将整个源文件复制并粘贴到问题输入框。你在浪费每个人的时间。您已经修改了源代码至少两次,完全更改了源代码并使以前的所有注释和答案无效。按原样发布整个可编译程序。确保编译时没有警告。使用
-Wall
。让我最后一次尝试帮助你(不一定友好)。是您提交的代码的外观。注意:此代码没有任何带有
-Wall
的警告,不显示故障,并显示预期结果。请确保您的代码没有任何带有
-Wall
的警告,然后完整发布。如果它确实有警告,而您不知道如何消除它们,请提及。谢谢。我试过你的建议,但我还是有一个核心转储。我用我的编辑更新了Q。我也开始使用-Wall,我没有收到任何与此相关的警告/错误:/