我有一些代码,它接受一个文件,将每一行读入一个新的字符串数组(并为每个字符添加128),然后将每个数组分配到一个指针数组,然后打印每个数组.尝试运行代码时,由于以下原因,我收到错误,指出了分段错误:
strlen () at ../sysdeps/x86_64/strlen.S:106
106 ../sysdeps/x86_64/strlen.S: No such file or directory.
但我从来没有在我的代码中调用strlen?
#include#include #include #define ROW 10 #define COL 40 #define ARGS 2 #define FLIP_VALUE 128 char** read_file (char* argv[], char **array_pointers); char* new_array (void); void print_strings (char** array_pointers); int main(int argc, char* argv[]) { char **array_pointers = NULL; if (argc == ARGS) { array_pointers = read_file(&argv[1], array_pointers); print_strings(array_pointers); } return 0; } char** read_file (char* argv[], char **array_pointers) { FILE* file_name; int i = 0, j = 0; char c; char *temp_array; array_pointers = malloc(sizeof(char*) * ROW); file_name = fopen(argv[0], "r"); assert(file_name); if (file_name) /* if file is not null */ { while (c != EOF) /* while not equal to end of file */ { for (j = 0; j < ROW; j++) /* for each row */ { temp_array = new_array(); /* generate a new array for each new string (row) */ for (i = 0; i < COL; i++) /* for each char in a row */ { c = fgetc(file_name); temp_array[i] = c + FLIP_VALUE; } array_pointers[j] = temp_array; /*assign array pointers to point at each new temp_array */ } } } return array_pointers; } char* new_array (void) { char* temp; temp = malloc(sizeof(char) * COL); assert(temp); return temp; } void print_strings (char** array_pointers) { int i = 0; for (i = 0; i < COL; i++) { printf("%s\n",array_pointers[i]); } }
完整堆栈跟踪读作:
#1 0x00007ffff7a84e3c in _IO_puts (str=0x0) at ioputs.c:36 result = -1 len =#2 0x0000000000400806 in print_strings (array_pointers=0x602010) at array_of_string_arrays.c:65 i = 10 #3 0x00000000004006a1 in main (argc=2, argv=0x7fffffffdff8) at array_of_string_arrays.c:19 array_pointers = 0x602010
Werner Henze.. 5
在print_strings
你打印字符串使用printf("%s", str);
.这要求字符串为空终止.如果您正在读取普通文本文件,则您写入的字符串不会以空值终止.您需要将终止空字节添加到您读取的字符串中 - 或者您无法使用printf
.
你遇到崩溃的原因是你printf
似乎首先要检查字符串strlen
在打印之前有多长(使用).strlen
递增char指针,直到它读取空字节.由于字符串中没有任何内容,因此strlen
读取缓冲区后最后会在内存中的某处读取空字节,或者如果不允许读取该内存则会崩溃.
在print_strings
你打印字符串使用printf("%s", str);
.这要求字符串为空终止.如果您正在读取普通文本文件,则您写入的字符串不会以空值终止.您需要将终止空字节添加到您读取的字符串中 - 或者您无法使用printf
.
你遇到崩溃的原因是你printf
似乎首先要检查字符串strlen
在打印之前有多长(使用).strlen
递增char指针,直到它读取空字节.由于字符串中没有任何内容,因此strlen
读取缓冲区后最后会在内存中的某处读取空字节,或者如果不允许读取该内存则会崩溃.