gpt4 book ai didi

c - 为什么我的 C 字符串堆栈有 valgrind-3.1.1 报告的无效写入

转载 作者:行者123 更新时间:2023-11-30 18:02:03 24 4
gpt4 key购买 nike

valgrind 报告大小为 8 的无效写入

位于 0x4007A0:ArrayCstringPush

由 0x4008F8:main

地址 0x4A0A450 是分配大小为 8 的 block 后的 0 个字节

在 0x4905D27:calloc

通过 0x......:ArrayCstringNew

由 0x......: 主要

为什么会报这个错误?以及如何解决这个问题。谢谢!

  //arrayOfCstring.h

typedef struct {
int numOfElems;
int size;
int allocSize;
char** elems;
//size_t elemAllocSize;

} ArrayCstring;

void ArrayCstringNew(ArrayCstring *s,int allocS)
{
s->allocSize=allocS;
s->numOfElems=0;
s->size=0;
s->elems=(char **)calloc(s->allocSize,sizeof(int));
assert(s->elems!=0);
}
void ArrayCstringGrow(ArrayCstring *s){
if(((s->numOfElems)+1)>(s->allocSize)){
s->allocSize=(s->allocSize)*2;
s->elems=(char**)realloc(s->elems,(s->allocSize)*sizeof(int));
}
}
void ArrayCstringPush(ArrayCstring *s,char *elem,int lengthOfElem){
ArrayCstringGrow(s);
//(s->elems)[s->numOfElems]=(char *)malloc(lengthOfElem);

(s->elems)[s->numOfElems]=(char *)calloc(lengthOfElem,sizeof(int));
printf("start to realloc numOfElem is %i, allocSize is %i\n",s->numOfElems,s->allocSize);
strcpy((s->elems)[s->numOfElems],elem);
//assert((s->elems)!=0);
printf("push %s\n",s->elems[s->numOfElems]);
s->numOfElems+=1;
}
char *ArrayCstringIndex(ArrayCstring *s,int i)
{
//assert((s->numOfElems)>i);
return s->elems[i];
}

void ArrayCstringDelete(ArrayCstring *s)
{
int a=0;
for(;a<(s->numOfElems);++a){
free((s->elems)[a]);
}
free(s->elems);
}


//MAIN FUNCTION
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "arrayOfCstring.h"

int main(void){
ArrayCstring *ep;
ep =(ArrayCstring *)malloc(1000);
ArrayCstringNew(ep,2);
ArrayCstringPush(ep,"ysdfsd",7);
printf("start to \n");
ArrayCstringPush(ep,"1213423",8);
int a;
for(a=0;a<2;++a){
char *str=ArrayCstringIndex(ep,a);
printf("string is %s\n",str);
}
ArrayCstringDelete(ep);
}

最佳答案

代码中存在多次误用malloc()calloc()的情况,可能是导致无效写入的原因。

更改:

ep =(ArrayCstring *)malloc(1000);

s->elems=(char **)calloc(s->allocSize,sizeof(int));

(s->elems)[s->numOfElems]=(char *)calloc(lengthOfElem,sizeof(int));

至:

ep = malloc(sizeof(ArrayCstring));

s->elems= calloc(s->allocSize,sizeof(char*));

(s->elems)[s->numOfElems]= strdup(elem);

分别。

关于c - 为什么我的 C 字符串堆栈有 valgrind-3.1.1 报告的无效写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com