我正在使用C中的动态内存。我正在编写一个应该
的小函数我的程序会出现分段错误。
char *new_line(char *line) {
char *temp_line;
int line_len = strlen(line)+1;
temp_line = malloc(line_len * sizeof(char));
printf(temp_line);
strncpy(temp_line,line,line_len);
return temp_line;
}
根据GDB,我的程序在此函数上失败,因为显然它正在尝试对地址0x0执行某些操作(?)。 这就是GDB所说的:
#0 0x00007ffff7b7c3c1 in __strlen_sse2_pminub () from /lib64/libc.so.6
#1 0x00000000004008fc in new_line (line=0x0) at myfile.c:35
基于我的功能,任何人都能提供一些有关为什么malloc似乎正在返回或弄乱0x0的一些见解?我看不到它。
答案 0 :(得分:2)
#0 0x00007ffff7b7c3c1 in __strlen_sse2_pminub () from /lib64/libc.so.6
它strlen
崩溃了,而不是malloc
。
#1 0x00000000004008fc in new_line (line=0x0) at myfile.c:35
请注意line=0x0
。这意味着line
为NULL。调用new_line
的代码传递空指针。
int line_len = strlen(line)+1;
这反过来导致strlen
被赋予空指针。
答案 1 :(得分:1)
printf
在内部使用strlen
。
您在printf
的缓冲区上调用malloc
,其中包含[可能]随机字符[它不初始化字节]。因此,strlen
可能只是“继续”#34;。
在printf
strncpy
答案 2 :(得分:1)
存在以下问题。
strncpy()
不会将'\0'
放在最后。你需要明确地说明。因为在这种情况下,您通过检查输入字符串的大小来分配内存,所以可以调用strcpy()
。
char *new_line(char *line) { char *temp_line = 0; if(0 == line) { printf("Input is null\n"); return 0 } int line_len = strlen(line)+1; temp_line = malloc(line_len * sizeof(char)); if(0 == temp_line) { printf("Failed to allocate memory for new string\n"); return 0; } strncpy(temp_line,line,line_len); temp_line[line_len-1] = '\0'; /* You can replace above two lines with strcpy(). */ printf("Inp string[%s] new string[%s]\n", line, temp_line); return temp_line; }