[C] läs in ord och bestäm längsta

Permalänk
Medlem

[C] läs in ord och bestäm längsta

Hej,
jag har kod som läser in en massa ord och sedan printar den längsta med antal bokstäver. Funkar prima på min dator MEN det funkar inte på rättningsdatorn (automatiserat system) som kör linux (jag kör OS X). Föreläsaren sa åt mig att använda valgrind men kan verkligen inte förstå hur man tolkar valgrind. Kan någon hjälpa mig med vad som är fel?

#define true = 1 #define false = 0 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int input(char *s, int length); int main(void) { int size = 32; char* result = (char*)malloc(size*sizeof(char)); char* readto = (char*)malloc(size*sizeof(char)); int max = 0; int c; int count; while ((c = getchar()) != EOF) { count = 0; while (isalpha(c)) { if (count == size) { size*=2; result = realloc(result, sizeof(char)*size); readto = realloc(readto, sizeof(char)*size); } readto[count] = c; count++; c = getchar(); } if (count > max) { strcpy(result, readto); max = count; } } free(readto); free(result); printf("%d characters in longest word: %s\n", max, result); return 0; }

kod

==24064== Memcheck, a memory error detector ==24064== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==24064== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info ==24064== Command: ./a.out --leak-check=full ==24064== ==24064== Syscall param msg->desc.port.name points to uninitialised byte(s) ==24064== at 0x1003A834A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib) ==24064== by 0x1003A7796: mach_msg (in /usr/lib/system/libsystem_kernel.dylib) ==24064== by 0x1003A1485: task_set_special_port (in /usr/lib/system/libsystem_kernel.dylib) ==24064== by 0x10053D10E: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib) ==24064== by 0x10053D458: _libtrace_init (in /usr/lib/system/libsystem_trace.dylib) ==24064== by 0x1000A69DF: libSystem_initializer (in /usr/lib/libSystem.B.dylib) ==24064== by 0x100018A1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==24064== by 0x100018C1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==24064== by 0x1000144A9: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==24064== by 0x100014440: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==24064== by 0x100013523: ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==24064== by 0x1000135B8: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) ==24064== Address 0x10488be6c is on thread 1's stack ==24064== in frame #2, created by task_set_special_port (???:) ==24064== test ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10025FAC4: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009AC3C: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009AC84: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009ACC8: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009ACD2: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009AD11: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009AD16: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Use of uninitialised value of size 8 ==24064== at 0x10009AD88: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Use of uninitialised value of size 8 ==24064== at 0x10009AD8A: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Conditional jump or move depends on uninitialised value(s) ==24064== at 0x10009AD95: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10025FAF3: strcpy (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000AB5: main (word.c:34) ==24064== ==24064== Invalid read of size 1 ==24064== at 0x100099CE1: strlen (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x1002A59FB: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab80 is 0 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12) ==24064== ==24064== Invalid read of size 1 ==24064== at 0x100099CEA: strlen (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x1002A59FB: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab82 is 2 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12) ==24064== ==24064== Invalid read of size 16 ==24064== at 0x1004F25C5: _platform_memchr$VARIANT$Base (in /usr/lib/system/libsystem_platform.dylib) ==24064== by 0x10029E4D1: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A8898: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab80 is 0 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12) ==24064== ==24064== Invalid read of size 16 ==24064== at 0x1004F25C9: _platform_memchr$VARIANT$Base (in /usr/lib/system/libsystem_platform.dylib) ==24064== by 0x10029E4D1: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A8898: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab90 is 16 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12) ==24064== ==24064== Invalid read of size 2 ==24064== at 0x10009ACFB: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10029E550: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A8898: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab80 is 0 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12) ==24064== 4 characters in longest word: test ==24064== ==24064== HEAP SUMMARY: ==24064== in use at exit: 26,225 bytes in 161 blocks ==24064== total heap usage: 179 allocs, 18 frees, 32,433 bytes allocated ==24064== ==24064== LEAK SUMMARY: ==24064== definitely lost: 0 bytes in 0 blocks ==24064== indirectly lost: 0 bytes in 0 blocks ==24064== possibly lost: 72 bytes in 3 blocks ==24064== still reachable: 4,296 bytes in 7 blocks ==24064== suppressed: 21,857 bytes in 151 blocks ==24064== Rerun with --leak-check=full to see details of leaked memory ==24064== ==24064== For counts of detected and suppressed errors, rerun with: -v ==24064== Use --track-origins=yes to see where uninitialised values come from ==24064== ERROR SUMMARY: 21 errors from 16 contexts (suppressed: 4 from 4)

valgrind output

Löst, postar svar nedan för referens.

Skrivet av perost:

Du anropar free på result innan du skriver ut resultatet.

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Avstängd

Du har ju inte initierat "count"

Permalänk
Medlem
Skrivet av videopac:

Du har ju inte initierat "count"

Jo. rad 16> int count;
19> count = 0;

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Avstängd

Haha! Ja, det första man blir blind på är ögonen!

Permalänk
Medlem
Skrivet av videopac:

Haha! Ja, det första man blir blind på är ögonen!

Lätt hänt

Testade SSHA in på en linuxdator och får fel output där.

./a.out test 4 characters in longest word: test

macoutput

./a.out test 4 characters in longest word: ȻJq?

linux
Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Medlem

Du anropar free på result innan du skriver ut resultatet.

Permalänk
Medlem
Skrivet av perost:

Du anropar free på result innan du skriver ut resultatet.

Hjälte. Silken idiot jag är.

Min stora fråga är ju dock varför det funkar på mac?

Disclaimer: Jag har bara lärt mig C i 2 veckor och läst Java tidigare så därför är jag van vid att sådant skulle ge errors snarare än utskrift

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Medlem
Skrivet av Pelegrino:

Min stora fråga är ju dock varför det funkar på mac?

Att använda frigört minne resulterar i odefinierat beteende, d.v.s. precis vad som helst kan hända. Java har sin garbage collector som jag antar kan detektera sånt, men i C är man själv ansvarig för att man använder giltigt minne.

Valgrind kan vara lite svår att tolka, och allt som rapporteras av Valgrind är inte fel. Men i detta fall så visar Valgrind faktiskt precis vad som gått fel:

==24064== Invalid read of size 2 ==24064== at 0x10009ACFB: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10029E550: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A8898: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab80 is 0 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12)

D.v.s. Valgrind säger att printf försökt läsa ogiltigt minne på rad 40, och att detta minne frigjordes på rad 39 och allokerades på rad 12.

Permalänk
Medlem
Skrivet av perost:

Att använda frigört minne resulterar i odefinierat beteende, d.v.s. precis vad som helst kan hända. Java har sin garbage collector som jag antar kan detektera sånt, men i C är man själv ansvarig för att man använder giltigt minne.

Valgrind kan vara lite svår att tolka, och allt som rapporteras av Valgrind är inte fel. Men i detta fall så visar Valgrind faktiskt precis vad som gått fel:

==24064== Invalid read of size 2 ==24064== at 0x10009ACFB: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x10029E550: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A8898: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002CE422: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A433D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x1002A2247: printf (in /usr/lib/system/libsystem_c.dylib) ==24064== by 0x100000B8A: main (word.c:40) ==24064== Address 0x100b5ab80 is 0 bytes inside a block of size 32 free'd ==24064== at 0x1000989F3: free (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000B75: main (word.c:39) ==24064== Block was alloc'd at ==24064== at 0x100098616: malloc (in /usr/local/Cellar/valgrind/3.13.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==24064== by 0x100000BD2: __check_malloc (malloc.c:57) ==24064== by 0x100000A8A: main (word.c:12)

D.v.s. Valgrind säger att printf försökt läsa ogiltigt minne på rad 40, och att detta minne frigjordes på rad 39 och allokerades på rad 12.

Coolt! Valgrind verkar vara en hel vetenskap men toppen när man förstår det.

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl