memcpy(C)的分段错误

时间:2014-04-17 03:03:12

标签: c memcpy

我遇到了#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;
}

感谢您的帮助。

5 个答案:

答案 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).