Valgrind 分段错误无效写入大小 8 C
Valgrind Segmentation Fault Invalid write size 8 C
我似乎不明白为什么我的程序在为字符指针分配内存时会导致错误。这是我的代码:
我想要实现的是将数据插入到数组中,稍后可以通过 for 循环读取数据以插入到完全不同的链表中。但是,这段代码似乎引起了问题?请帮忙!
struct fileData {
char **data;
size_t used;
size_t size;
};
void initData(struct fileData *a, size_t initialSize) {
a->data = malloc(initialSize * sizeof(char));
if(a->data == NULL) {
printf("ERROR: Memory allocation failure!\n");
exit(1);
}
a->used = 0;
a->size = initialSize;
}
void insertLine(struct fileData *a, char *element) {
if(a->used == a->size) {
void *pointer;
a->size *= 2;
pointer = realloc(a->data, a->size * sizeof(char));
if(pointer == NULL) {
freeData(a);
printf("ERROR: Memory allocation failure!\n");
exit(1);
}
a->data = pointer;
}
if(element != NULL) {
printf("size: %ld", sizeof(element));
a->data[a->used++] = malloc(sizeof(element));
if(a->data[a->used++] != NULL)
strcpy(a->data[a->used++], element);
} else
a->data[a->used++] = NULL;
}
void freeData(struct fileData *a) {
size_t i;
/* Free all the copies of the strings */
for (i = 0 ; i < a->used; i++)
free(a->data[i]);
free(a->data);
free(a);
}
Valgrind 的结果:
==8224== Invalid write of size 8
==8224== at 0x1000015D7: insertLine (ets_utility.c:129)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d2e8 is 3 bytes after a block of size 5 alloc'd
==8224== at 0x6B1B: malloc (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x10000146F: initData (ets_utility.c:99)
==8224== by 0x1000018BF: load_data (ets_utility.c:190)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid read of size 8
==8224== at 0x1000015F9: insertLine (ets_utility.c:130)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d2f0 is 11 bytes after a block of size 5 alloc'd
==8224== at 0x6B1B: malloc (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x10000146F: initData (ets_utility.c:99)
==8224== by 0x1000018BF: load_data (ets_utility.c:190)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid read of size 8
==8224== at 0x100001625: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d318 is 24 bytes before a block of size 4,096 free'd
==8224== at 0x6F57: free (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x13E7D2: fclose (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001422: readfile (ets_utility.c:86)
==8224== by 0x1000018C8: load_data (ets_utility.c:193)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid write of size 1
==8224== at 0x8C73: memmove$VARIANT$sse3x (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0xDDA1B: __strcpy_chk (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001706: __inline_strcpy_chk (_string.h:94)
==8224== by 0x100001632: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==8224==
==8224==
==8224== Process terminating with default action of signal 11 (SIGSEGV)
==8224== Access not within mapped region at address 0x0
==8224== at 0x8C73: memmove$VARIANT$sse3x (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0xDDA1B: __strcpy_chk (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001706: __inline_strcpy_chk (_string.h:94)
==8224== by 0x100001632: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
感谢您的帮助...对 C:/
还是个新手
你有
a->data = malloc(initialSize * sizeof(char));
和
pointer = realloc(a->data, a->size * sizeof(char));
对于第一个 malloc
,您分配 initialSizè
字节 ,指针通常为四或八个字节,因此您只需要四分之一或八个字节已分配内存。
您需要使用 sizeof(char *)
作为尺码。
我似乎不明白为什么我的程序在为字符指针分配内存时会导致错误。这是我的代码:
我想要实现的是将数据插入到数组中,稍后可以通过 for 循环读取数据以插入到完全不同的链表中。但是,这段代码似乎引起了问题?请帮忙!
struct fileData {
char **data;
size_t used;
size_t size;
};
void initData(struct fileData *a, size_t initialSize) {
a->data = malloc(initialSize * sizeof(char));
if(a->data == NULL) {
printf("ERROR: Memory allocation failure!\n");
exit(1);
}
a->used = 0;
a->size = initialSize;
}
void insertLine(struct fileData *a, char *element) {
if(a->used == a->size) {
void *pointer;
a->size *= 2;
pointer = realloc(a->data, a->size * sizeof(char));
if(pointer == NULL) {
freeData(a);
printf("ERROR: Memory allocation failure!\n");
exit(1);
}
a->data = pointer;
}
if(element != NULL) {
printf("size: %ld", sizeof(element));
a->data[a->used++] = malloc(sizeof(element));
if(a->data[a->used++] != NULL)
strcpy(a->data[a->used++], element);
} else
a->data[a->used++] = NULL;
}
void freeData(struct fileData *a) {
size_t i;
/* Free all the copies of the strings */
for (i = 0 ; i < a->used; i++)
free(a->data[i]);
free(a->data);
free(a);
}
Valgrind 的结果:
==8224== Invalid write of size 8
==8224== at 0x1000015D7: insertLine (ets_utility.c:129)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d2e8 is 3 bytes after a block of size 5 alloc'd
==8224== at 0x6B1B: malloc (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x10000146F: initData (ets_utility.c:99)
==8224== by 0x1000018BF: load_data (ets_utility.c:190)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid read of size 8
==8224== at 0x1000015F9: insertLine (ets_utility.c:130)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d2f0 is 11 bytes after a block of size 5 alloc'd
==8224== at 0x6B1B: malloc (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x10000146F: initData (ets_utility.c:99)
==8224== by 0x1000018BF: load_data (ets_utility.c:190)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid read of size 8
==8224== at 0x100001625: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x10001d318 is 24 bytes before a block of size 4,096 free'd
==8224== at 0x6F57: free (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0x13E7D2: fclose (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001422: readfile (ets_utility.c:86)
==8224== by 0x1000018C8: load_data (ets_utility.c:193)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224==
==8224== Invalid write of size 1
==8224== at 0x8C73: memmove$VARIANT$sse3x (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0xDDA1B: __strcpy_chk (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001706: __inline_strcpy_chk (_string.h:94)
==8224== by 0x100001632: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
==8224== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==8224==
==8224==
==8224== Process terminating with default action of signal 11 (SIGSEGV)
==8224== Access not within mapped region at address 0x0
==8224== at 0x8C73: memmove$VARIANT$sse3x (in /usr/local/Cellar/valgrind/3.10.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==8224== by 0xDDA1B: __strcpy_chk (in /usr/lib/system/libsystem_c.dylib)
==8224== by 0x100001706: __inline_strcpy_chk (_string.h:94)
==8224== by 0x100001632: insertLine (ets_utility.c:131)
==8224== by 0x100001751: readLines (ets_utility.c:149)
==8224== by 0x1000018F3: load_data (ets_utility.c:199)
==8224== by 0x1000010FE: main (ets_main.c:44)
感谢您的帮助...对 C:/
还是个新手你有
a->data = malloc(initialSize * sizeof(char));
和
pointer = realloc(a->data, a->size * sizeof(char));
对于第一个 malloc
,您分配 initialSizè
字节 ,指针通常为四或八个字节,因此您只需要四分之一或八个字节已分配内存。
您需要使用 sizeof(char *)
作为尺码。