【问题标题】:Appending Strings Using Pointers In C在 C 中使用指针附加字符串
【发布时间】:2013-03-24 13:40:07
【问题描述】:

在我的一生中,我无法弄清楚为什么这个程序不起作用。我正在尝试使用指针连接两个字符串并不断收到此错误:

a.out(28095) malloc: *** error 
for object 0x101d36e9c: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug

我的 str_append.c:

#include <stdio.h>
#include <stdlib.h>
#include "stringlibrary.h"  /* Include the header (not strictly necessary here) */

//appends s to d
void str_append(char *d, char *s){
  int i=0, j=0;

  d = realloc(d, strlength(d)+strlength(s)+1);
  //find the end of d
  while(*(d+i)!='\0'){
    i++;
  }


  //append s to d
  while(*(s+j)!='\0'){
    *(d+i)=*(s+j);
    i++;
    j++;
  }
  *(d+i)='\0';


}

我有自己的 strlength 函数,我 100% 肯定它有效。

我的 main.c:

#include <stdio.h>
#include <stdlib.h>
#include "stringlibrary.h"

int main(int argc, char **argv)
{
 char* str = (char*)malloc(1000*sizeof(char));
 str = "Hello";
 char* str2 = (char*)malloc(1000*sizeof(char)); 
str2 = " World";

str_append(str, str2);


 printf("Original String: %d\n", strlength(str));
 printf("Appended String: %d\n", strlength(str));


return 0;
}

我尝试重新分配给临时变量并收到相同的错误。任何帮助表示赞赏。

编辑: 感谢所有的答案。这个网站很棒。我不仅知道我哪里出错了(我猜是简单的错误),而且我发现了一个我不知道的关于弦乐的大漏洞。因为我不能使用 strcpy 函数,所以我自己实现了。基本上就是strcpy的源码了。

char *string_copy(char *dest, const char *src)
{
 char *result = dest;
 while (*dest++ = *src++);
 return result;
}

【问题讨论】:

    标签: c string pointers append


    【解决方案1】:

    字符串字面量(例如:"MAMA" "MEME")是不可变的。你不能重新分配它们,但是,如果你使用字符指针(例如char * s = (char*)malloc(sizeof(char) * LEN)并分配它们,那么它们是可变的。

    这里:

    char* str = (char*)malloc(1000*sizeof(char));
    str = "Hello"; //no error BUT wasted memory and cant be reallocated anymore (literal)
    

    你应该在字符串操作中使用内置函数...

    【讨论】:

      【解决方案2】:
      char* str = (char*)malloc(1000*sizeof(char));
      str = "Hello";
      

      应该是:

      char* str = malloc (1000);
      strcpy (str, "Hello");
      

      前者分配一些内存并将该内存的地址存储到str指针中,然后更改str指针指向不同(未分配)记忆。

      这就是你看到pointer being realloc'd was not allocated的原因。

      后一个代码段让str 指向分配的内存并将字符串复制到该内存中。


      而且,顺便说一句,你永远不应该在 C 中转换来自 malloc 的返回值 - 它可以隐藏某些细微的错误并且这是不必要的,因为 C 完全能够将返回的 void* 隐式转换为任何其他指针类型.

      此外,由于sizeof(char) 始终为一,因此您无需乘以它。它通常会不必要地使代码混乱。

      最后,虽然在这种情况下可能不太重要,但 C 标准保留以 strmemwcs 开头的标识符(每个后跟一个小写字母)以供将来的库方向使用,因此您可能想要如果您想要未来的可移植性,请重新考虑使用 strlength() 之类的东西。

      【讨论】:

      • 谢谢。我需要学习很多东西,你真的帮助我扩展了一些我还没有弄清楚的东西。我会使用指向字符串文字开头的循环将其复制到分配的内存中吗?
      • @user2066723,我自己会使用strcpy,但是,如果你不能使用这些功能(例如,家庭作业),你会逐个字符循环,就像你在str_append.
      【解决方案3】:

      您正在尝试重新分配指向静态变量的指针。当你设置

      str = "Hello";

      您正在静态分配该变量(即它将在​​编译时分配)。那么它不是用于其他目的的有效指针,包括realloc。通过丢弃指向该内存的唯一指针,您还浪费了您在上面一行中使用 malloc 检索到的所有空间。

      您需要做的是使用strcpy 来分配值:

      strcpy(str, "Hello");

      那么你还有一个动态分配的指针,可以用于realloc

      【讨论】:

      • 谢谢。我错误地认为我正在将字符串文字分配给分配的内存。我责怪我对 Java 编码的唯一经验和对 C 的有限知识。:)
      【解决方案4】:

      你的问题来了

      char* str = (char*)malloc(1000*sizeof(char));
      str = "Hello";
      

      首先为 1000 个字符分配空间,并将指针指向该内存的开头。
      然后在第二行中,将指针指向导致内存泄漏的字符串文字。
      您的指针不再指向分配的内存。
      稍后在您的函数中,您尝试更改只读的字符串文字。

      【讨论】:

      • 在为字符串指针分配内存后,为它分配一些数据,您可能想要执行类似 strcpy(str, "Hello");
      • @TheCodeArtist 和 Armin 谢谢!哇,我猜我的 C 技能达不到标准。在不使用 strcpy 的情况下如何将字符串分配给分配的内存?这是一个作业,我不能使用 string.h 库。
      • 我是否会创建一个指向字符串字面量开头的新指针,然后将新指针循环到为 str 指针分配的内存中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多