gpt4 book ai didi

C - valgrind 条件跳转或移动取决于未初始化的值

转载 作者:行者123 更新时间:2023-11-30 16:20:25 24 4
gpt4 key购买 nike

proj2.c:

#include <stdio.h>
#include "duplicate.h"
#include<stdlib.h>
int main(int argc, char **argv)
{
if (argc <= 1)
{
return 1;
}
char **copy = duplicate_args(argc, argv);
char **p = copy;
argv++;
p++;

//while (*argv)
for(int i=0;i<argc-1;i++)
{
printf("%s %s\n", argv[i], p[i]);
}

free_duplicated_args(argc,copy);
return 0;
}

重复.c:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
char **duplicate_args(int argc, char **argv)
{
char **arrPointer=(char**)malloc((argc)*sizeof(char*));
for(int i=0;i<argc;i++)
{
// Added one for string terminator '\0'
arrPointer[i] = (char*)malloc((strlen(argv[i])*(sizeof(char)))+1);
for(int j=0;j<strlen(argv[i]);j++)
{
if(argv[i][j] > 64 && argv[i][j] < 91)
{
arrPointer[i][j]=argv[i][j]+32;
}
else if(argv[i][j] > 96 && argv[i][j] < 123)
{
arrPointer[i][j]=argv[i][j]-32;
}
else
{
arrPointer[i][j]=argv[i][j];
}
}
arrPointer[i]+= '\0';

}
return arrPointer;
}

void free_duplicated_args(int argc,char **copy)
{
/* while(copy[i])
{
free(copy[i]);
i++;
}
free(copy);
*/
for(int i=0;i<argc;i++)
{
free(copy[i]);
}
free(copy);
}

重复.h:

char **duplicate_args(int argc, char **argv);

void free_duplicated_args(int argc,char **copy);

在我上面的代码中,重复函数首先创建一个指针数组(取决于 argc),然后在循环中将整个数组的每个元素指向另一个保存重复字符串的指针。我没有任何内存泄漏,但有错误说我正在根据未初始化的值进行跳转?我正在使用 --track-origins=yes 但仍然无法弄清楚为什么会发生这种情况?

┌─[✗]─[root@danial]─[~/Documents/OS/proj2/project]
└──╼ # valgrind --tool=memcheck --track-origins=yes ./proj2 1
==15798== Memcheck, a memory error detector
==15798== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==15798== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==15798== Command: ./proj2 1
==15798==
==15798== Conditional jump or move depends on uninitialised value(s)
==15798== at 0x4838CD8: __strlen_sse2 (vg_replace_strmem.c:462)
==15798== by 0x48B9BEE: vfprintf (vfprintf.c:1638)
==15798== by 0x48C0815: printf (printf.c:33)
==15798== by 0x1091F5: main (in /root/Documents/OS/proj2/project/proj2)
==15798== Uninitialised value was created by a heap allocation
==15798== at 0x483577F: malloc (vg_replace_malloc.c:299)
==15798== by 0x10928E: duplicate_args (in /root/Documents/OS/proj2/project/proj2)
==15798== by 0x109194: main (in /root/Documents/OS/proj2/project/proj2)
==15798==
1 1
==15798==
==15798== HEAP SUMMARY:
==15798== in use at exit: 0 bytes in 0 blocks
==15798== total heap usage: 4 allocs, 4 frees, 1,050 bytes allocated
==15798==
==15798== All heap blocks were freed -- no leaks are possible
==15798==
==15798== For counts of detected and suppressed errors, rerun with: -v
==15798== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

最佳答案

正如 @AnttiHaapala 所指出的,我只需在 for 循环内附加 '\0' 即可。

for(int i=0;i<argc;i++)
{
// Added one for string terminator '\0'
arrPointer[i] = (char*)malloc((strlen(argv[i])*(sizeof(char)))+1);
for(int j=0;j<=strlen(argv[i]);j++)
{
if(j==strlen(argv[i]))
{
arrPointer[i][j]='\0';
continue;
}
if(argv[i][j] > 64 && argv[i][j] < 91)
{
arrPointer[i][j]=argv[i][j]+32;
}
else if(argv[i][j] > 96 && argv[i][j] < 123)
{
arrPointer[i][j]=argv[i][j]-32;
}
else
{
arrPointer[i][j]=argv[i][j];
}
}
}

关于C - valgrind 条件跳转或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311967/

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