2

私はしばらくプログラミングをしていますが、Cは初めてです。このリンクリストの実装は、テストする必要があるansiCにあります。問題を無効な書き込みの問題に絞り込みました。Valgrindでコードを実行し、次の出力を受け取りました。

==18131== Invalid write of size 1
==18131==    at 0x4C2C0CC: __GI_strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64 linux.so)
==18131==    by 0x40089B: main (in /home/btm7984/hw3/TestList)
==18131==  Address 0x51f1388 is 0 bytes after a block of size 8 alloc'd
==18131==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18131==    by 0x400880: main (in /home/btm7984/hw3/TestList)
==18131==
==18131== Invalid write of size 1
==18131==    at 0x4C2C0DF: __GI_strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18131==    by 0x40089B: main (in /home/btm7984/hw3/TestList)
==18131==  Address 0x51f138e is 6 bytes after a block of size 8 alloc'd
==18131==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18131==    by 0x400880: main (in /home/btm7984/hw3/TestList)
==18131==
--18131-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--18131-- si_code=1;  Faulting address: 0x6D4FCAA;  sp: 0x402bdae00

これから私が確認できるのは、私が何か間違ったものを割り当てているということだけです。私はそれが私のstrcpyラインにあるに違いないと思います。私は本当にこの質問にアプローチする方法を知りません。以下は、LinkedListsインターフェースの使用です。InitLinkedLists、AddToBackOfList、およびDestroyListはすべて、そのインターフェイスで定義されます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkedLists.h"

int main(int argc, char *argv[]) {

  FILE *fp;
  char tmpString[100];
  LinkedLists *ListPtr = malloc(sizeof(LinkedLists));
  ElementStructs *DataPtr;
  LinkedListNodes* curr = malloc(sizeof(LinkedListNodes));
  int counter = 0;
  int Done = 0;

  InitLinkedList(ListPtr);
  fp = fopen(argv[1], "r");
  if (!fp){
    fprintf(stderr,"%s Cannot open file %s\n", argv[0], argv[1]);
    exit(1);
  }
  do{
    fscanf(fp,"%s",tmpString);
    if (!feof(fp)) {
      DataPtr = malloc(sizeof(DataPtr));
      printf("%d   %d : %d\n",counter,(int)strlen(DataPtr->str),(int)strlen(tmpString));
      strcpy(DataPtr->str,tmpString);
      DataPtr->index=counter;
      AddToBackOfLinkedList(ListPtr, DataPtr);
      counter++;
      Done = 1;
    } else {
      Done = 0;
    }
  }while (Done);

結論として、strcpyが無効な書き込みを引き起こしていると思いますが、その理由はわかりません。

どんな助けでも大歓迎です。前もって感謝します。

編集:ElementStructsは次のように定義されています:

typedef struct ElementStructs
   {
   /* Application Specific Definitions */
   int index;
   char str[100];
  } ElementStructs;
4

1 に答える 1

3

問題は次のステートメントにあります。

DataPtr = malloc(sizeof(DataPtr));

完全な構造体ではなく、ポインタを保持するのに十分なメモリのみを割り当てます。

以下を使用して割り当てる必要があります。

DatapPtr = malloc(sizeof(ElementStructs));

または、コメント(WhozCraig)で説明されているように:

DatapPtr = malloc(sizeof(*DataPtr));
于 2012-12-28T20:49:06.963 に答える