2

私の人生では、なぜこのプログラムが機能しないのかわかりません。ポインターを使用して 2 つの文字列を連結しようとしていますが、このエラーが発生し続けます。

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';


}

私は100%確実に機能する独自のstrlength関数を持っています。

私の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;
}
4

4 に答える 4

5

あなたの問題はここにあります

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

まず、1000 文字のスペースを割り当て、ポインタをそのメモリの先頭に向けます。
次に、2 行目でポインタを文字列リテラルに向けると、メモリ リークが発生します。
ポインタは、割り当てられたメモリを指しなくなりました。
そして、関数の後半で、読み取り専用の文字列リテラルを変更しようとします。

于 2013-04-03T02:49:40.193 に答える
4

静的変数へのポインターを再割り当てしようとしています。設定すると

str = "Hello";

その変数を静的に割り当てています (つまり、コンパイル時に割り当てられます)。を含む他の目的に使用する有効なポインターではありませんreallocmallocまた、そのメモリへの唯一のポインターを破棄することで、上記の行で取得したすべてのスペースを無駄にしています。

代わりに行う必要があるstrcpyのは、値を割り当てるために使用することです。

strcpy(str, "Hello");

その後、動的に割り当てられたポインターがまだあります。これを使用できますrealloc

于 2013-04-03T02:50:13.977 に答える
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)

文字列操作には組み込み関数を使用する必要があります...

于 2013-04-03T03:16:45.807 に答える