在以下代码中,字符串“12345678901234567890”无法完全复制到union-type变量。这让我很困惑?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
typedef union
{
int i;
long l;
float f;
double d;
void *v;
char *s;
char c;
} UType;
UType NewUType_s(char *s)
{
UType temp;
strcpy(temp.s, s); // If we print temp.s and s here, both of them are "12345678901234567890
return temp;
}
int main()
{
UType m;
m = NewUType_s("12345678901234567890");
printf("%s\n", m.s);
return 0;
}
结果是:1234567890123456和一些特殊字符?
此问题的解决方案可能是:
解决方案1:将malloc()
用于m;
解决方案2:将NewUType_s
样式更改为指针函数UType *NewUType_s(char *s);
,一切正常,
但是,有人知道上述程序没有正确结果的原因吗?
答案 0 :(得分:5)
此代码的问题在于,写入尚未初始化的指针是未定义的行为:temp.s
尚未分配一个可以复制字符串的内存块,因此strcpy
写入你的程序不拥有的内存。
修复此代码非常简单:在复制之前分配内存,如下所示:
UType NewUType_s(char *s)
{
UType temp;
temp.s = malloc(strlen(s)+1);
strcpy(temp.s, s);
return temp;
}
当然,您需要free
内存以避免内存泄漏。
答案 1 :(得分:2)