我的任务是编写一个使用动态内存的函数,该函数将使用字符串s
并提取出字符串的第二个元素,然后返回包含这些元素的新字符串。到目前为止,我的代码是:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char* skipping(const char* s)
{
int inc = 0; //new list incrementer
int len = strlen(s);
char* new_s = malloc(len + 1);
for (int i = 0; i < len - 1; i+=2) {
new_s[inc] = s[i];
inc++;
}
return new_s;
}
int main(void)
{
char* s = skipping("0123456789");
printf("%s\n", s);
free(s);
return 0;
}
这有效,但是当我使用Valgrind运行它时,我被告知我有一个错误,该错误是由于使用strlen
而引起的,但是我似乎无法修复它。任何帮助都会很棒!
错误消息:(在valgrind中)
==4596==
==4596== Conditional jump or move depends on uninitialised value(s)
==4596== at 0x4C32D08: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4596== by 0x4EBC9D1: puts (ioputs.c:35)
==4596== by 0x1087B4: main (in /home/ryan/ENCE260/lab6)
==4596==
02468 //this is the expected output
==4596==
==4596== HEAP SUMMARY:
==4596== in use at exit: 0 bytes in 0 blocks
==4596== total heap usage: 2 allocs, 2 frees, 1,035 bytes allocated
==4596==
==4596== All heap blocks were freed -- no leaks are possible
==4596==
==4596== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
答案 0 :(得分:1)
为什么Valgrind报告此错误?
从online manual上的Valgrind use of uninitialised or unaddressable values in system calls:
未初始化数据的来源通常是:
-过程中尚未初始化的局部变量。
-堆块的内容(与malloc,new或类似的函数一起分配),然后再(或构造函数)在其中写入内容。
Valgrind将在以下情况下投诉
程序已将未初始化的垃圾从堆块写入标准输出。
由于您在s
中使用了printf
而未将其终止,因此会导致错误。