我遇到了#34;分段错误"运行以下代码时出错,但我想知道原因:
int main()
{
char *str = "abcdefghijklmn";
void *str_v;
memcpy(str_v, str, 14);
printf("str_v is %s \n", (char *) str_v);
return 0;
}
感谢您的帮助。
答案 0 :(得分:3)
void *str_v;
将str_v
定义为void *
类型,即它可以将指针存储为任何类型的变量。但是,您需要通过memcpy
从源到目标将字符复制的内存空间。因此,您需要使用malloc
-
char *str_v = malloc(strlen(str) + 1);
strlen
不计算str
指向的字符串中的终止空字节。因此,您必须为终止空字节分配一个额外字节。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
// a string literal is read-only so make str
// const so attempting to change will cause
// compiler error
const char *str = "abcdefghijklmn";
// allocate memory dynamically to the
// string pointed to by str. +1 is for the
// terminating null byte since strlen does
// not count the null byte
char *str_v = malloc(strlen(str) + 1);
// malloc can fail if there is not enough
// memory to allocate. handle it
if(str_v == NULL) {
printf("error in memory allocation\n");
return 1;
}
// copy all bytes in the string pointed to
// by str to the buffer pointed to str_v.
// number of bytes to be copied is strlen(str) + 1
// +1 for copying the terminating byte as well
memcpy(str_v, str, strlen(str) + 1);
// print the copied string. It need not be
// cast to (char *) since str_v is already
// of type (char *)
printf("str_v is %s \n", str_v);
// free the dynamically allocated space
free(str_v);
return 0;
}
答案 1 :(得分:2)
您需要先为str_v
分配内存:
void *str_v = malloc(14);
答案 2 :(得分:2)
您正在memcpy(str_v, str, 14);
中使用未初始化的指针来修复它,您可以在它之前添加以下语句:
str_v = malloc(14);
if (str_v == NULL) { /* malloc failed */ }
答案 3 :(得分:0)
因为您没有为str_v
答案 4 :(得分:0)
你可以做到
char * str_v = strdup( str );
来自http://linux.die.net/man/3/strdup:
#include <string.h>
char *strdup(const char *s);
The strdup() function returns a pointer to a new string
which is a duplicate of the string s.
Memory for the new string is obtained with malloc(3),
and can be freed with free(3).