动态内存分配麻烦

时间:2018-01-09 18:38:55

标签: c

在将内存分配给" namn"后,程序停止运行。为什么呢?
目标是输入两个SEPARATE字符串并连接它们,然后打印。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char namn, fornamn[25], efternamn[25];
    scanf("%s", fornamn);
    scanf("%s", efternamn);

    namn = malloc((strlen(fornamn)+strlen(efternamn)+1)*sizeof(char));
    strcpy(namn, fornamn);
    strcat(namn, efternamn);
    printf("%s", namn);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

由于namn的类型为char,因此malloc的返回值将被截断为char的大小,这不足以存储有效的指针值。

修复是:

char *namn;

编译时,您的编译器可能会发出很多警告。阅读它们总是很有趣。示例gcc(不含选项:默认警告设置):

L:\>gcc test.c
test.c: In function 'main':
test.c:11:6: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
 namn = malloc((strlen(fornamn)+strlen(efternamn)+1)*sizeof(char));
      ^

除此之外,您可以通过以下方式限制用户输入并避免缓冲区溢出:

scanf("%24s", fornamn);
scanf("%24s", efternamn);

并且sizeof(char)始终为1.因此在分配字符串内存时无需指定它。

答案 1 :(得分:0)

变量namn是一个简单的char。 Malloc返回指向内存的指针。因此,您需要一个char指针(char * namn)。