c - 使用 strcpy 写入无效

标签 c memory-leaks valgrind

我已经编程有一段时间了,但我对 C 很陌生。我在 ansi C 中有这个链表实现,我需要测试它。我已将问题范围缩小到无效写入的问题。我通过 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 接口(interface)的使用。 InitLinkedLists、AddToBackOfList 和 DestroyList 均在该接口(interface)中定义。

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

最佳答案

问题出在这个声明中:

DataPtr = malloc(sizeof(DataPtr));

您只分配足够的内存来保存指针,而不是完整的结构。

您应该使用以下方式分配:

DatapPtr = malloc(sizeof(ElementStructs));

或者,如评论中所述(WhozCraig):

DatapPtr = malloc(sizeof(*DataPtr));

关于c - 使用 strcpy 写入无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075415/

相关文章:

c++ - 处理的异常可能导致内存泄漏? (使用调用 exit() 的异常处理。)

memory-management - 如何在centos 5.5中安装valgrind 3.9.0

c - 将数组从 C 传递到 nasm 时出现段错误

c - 向下转换具有非多态类型的层次结构

ios - 请求访问通讯簿时出现MachMessagePort错误

ios - AVAudioPlayer 预加载的声音从内存中泄漏

c - 在 C 中通过命令行传递整数?

c - 为什么这段代码不起作用?

android - 在调用 Bitmap.recycle() 之后我应该信任垃圾收集器吗?

performance - 有没有工具可以测量 C 程序中的所有缓存级别?