2014-09-08 4 views
0

Я новичок в C, и я выполняю некоторые упражнения с Valgrind.Ошибка неинициализированных байтов в Valgrind

Мой код:

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

int main() 
{ 
    int i; 
    int ints[10]; 
    char myString[50]; 

    for (i=0; i<=10; i++) { 
     ints[i] = rand() % 10; 
    } 

    printf("''string'' is %lu characters long\n", strlen(myString)); 
    strcpy(myString, "This is a medium sized string"); 
    printf("''string'' is %lu characters long\n", strlen(myString)); 

    return 0; 
} 

Мой выход Valgrind:

==5425== Syscall param write(buf) points to uninitialised byte(s) 
==5425== at 0x260E9A: write$NOCANCEL (in /usr/lib/system/libsystem_kernel.dylib) 
==5425== by 0x17E5E8: __sflush (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x180CAA: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x18B191: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x1AF2DA: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x1AF6AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x186B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x18496F: printf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x100000E73: main (test.c:15) 
==5425== Address 0x100e is 14 bytes inside a block of size 4,096 alloc'd 
==5425== at 0x6DEB: malloc (in /usr/local/Cellar/valgrind/3.9.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) 
==5425== by 0x181855: __smakebuf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x196217: __swsetup (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x1AF158: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x1AF6AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x186B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x18496F: printf (in /usr/lib/system/libsystem_c.dylib) 
==5425== by 0x100000E73: main (test.c:15) 
==5425== Uninitialised value was created by a stack allocation 
==5425== at 0x100000DF0: main (test.c:6) 

Я имею в виду, что ошибка происходит из-за того, что myString является «пустой», когда я делаю свой первый printf звонок , однако я не уверен, как его решить.

Спасибо!

ответ

0

Я имею в виду, что ошибка происходит из-за того, что туЗЬптд «пустой»

Не совсем. myString не пуст, он неинициализирован, содержимое его не определено, поэтому strlen(myString) является незаконным.

Вы можете инициализировать его в пустую строку, как это:

char myString[50] = ""; 
+0

Это сработало, спасибо! – 2014-09-08 03:26:30

1

Строка myString не инициализируется, когда вы делаете strlen вызов здесь:

printf("''string'' is %lu characters long\n", strlen(myString)); 

Когда strlen функция проходит через myString в поисках '\0', он читает неинициализированные данные. Это то, что вызывает ошибку в valgrind.

Чтобы устранить эту проблему, добавьте инициализацию:

char myString[50] = {0}; 
0

Это не верно сказать, что myString пуст, он имеет некоторые контента. Просто контент произволен.

Это означает, что он может не имеет нулевые байты где-то там, чтобы завершить строку, поэтому вызов printf или strlen на это не хорошая идея, так как она может работать от конца буфера и причин проблемы.

Вы можете заставить его работать просто путем обеспечения его правильной строкой, например, с:

*myString = '\0'; 
Смежные вопросы