c - 数组连接函数返回乱码。

标签 c arrays pointers

这涉及到两个函数,下面列出了两个函数:

char *catw(char *s1, char sep, char *s2) 
{
  char s[strlen(s1) + strlen(s2) + 1];
  for(int i = 0; i < strlen(s1); i++) {
    s[i] = s1[i]; 
  }
  s[strlen(s1)] = sep;
  for(int j = 1; j <= strlen(s2); j++) {
    s[j + strlen(s1)] = s2[j]; 
  }
  char *rs = s;
  return rs;
}

上面的函数工作正常,它接受两个字符串并使用它们之间的字符将它们连接在一起。

char *catw_arr(char *ss[], char sep)
{
  char *ar = ss[0];
  for(int i = 1; i < strlen(ss); i++)
  {
    ar = catw(ar, sep, ss[i]);
    printf("%s\n", ar);

  }
  return ar;
}

然而,这个函数是有问题的。它应该采用一个字符串数组,其中一个 int 是数组的长度,还有一个分隔符,并将所有字符串连接在一起。 printf 在那里是因为我想测试发生了什么。

这是我正在使用的主要功能:

int main()
{
  char *abc[3] = {"a", "b", "c"};
  printf("%s\n", catw_arr(abc, 3, '/'));
  return 0;
}

这就是它产生的结果:

a/
?ĶS?/
?ĶS?/

老实说,我不知道问题出在哪里。我假设它将第一个字符串与分隔符连接起来,但随后它遇到了一些无法处理的废话并开始输出乱码。

最佳答案

函数 catw 实际上是你的问题。您正在将 s 变量定义为数组。该变量以及与其关联的存储仅在函数运行期间有效。

当您将 s 复制到 rs 时,您只需复制地址,而不是关联存储。一旦函数结束,srs 都指向已释放的内存,对它们的任何访问都将是未定义的行为。因为它们仍然指向堆栈内存,所以您不会遇到段错误,但您正在读取的数据已被其他内容替换。

关于c - 数组连接函数返回乱码。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41927078/

相关文章:

c - 将二维数组传递给 C 中的函数

c - 如何在 Eclipse 中使用来自不同项目的函数?

arrays - Rust 是如何实现数组索引的?

javascript - 如何遍历嵌套对象并将值放入数组?

c - C 代码结果不正确

C 字符指针

c - 执行后初始化一个 char 数组,因为大小最初未知

c - 使用 TYPE 进行元素分配时遇到问题

php - array_unique 和 preg_split PREG_SPLIT_NO_EMPTY 的等效项

c - 仅使用 void 指针探索内存