gpt4 book ai didi

c - 如何处理替换字符串文字以及为什么在堆上分配很重要?

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:17 26 4
gpt4 key购买 nike

我从一位编码人员那里听说,替换 C 字符串文字会导致未定义的行为。

例如:

char *a = "111";
a[0] = '2'; //Undefinded behaviour

但是,我没有像下面的练习那样找到解决方法,我必须将 12 小时时间转换为军事时间:

char* timeConversion(char* s) {
char* military_time = malloc(9*sizeof(char));
strncpy(military_time, s,8);
if(s[8] == 'P'){
if(s[0]!='1' || s[1]!='2'){
char hours = 10*(s[0]-'0')+(s[1]-'0');
hours += 12;
char tenner = (hours/10) + '0';
char onner = hours%10 + '0';
military_time[0] = tenner; //undefined
military_time[1] = onner;
}
} else {
if(s[0]=='1' && s[1] =='2'){
military_time[0] = '0';
military_time[1]= '0';
}
}
return military_time;
}

有没有办法解决这个问题?

此外,我想知道这段代码的行为。替换:

char* military_time = malloc(9*sizeof(char));

与:

char* military_time = "12345678";

导致错误行为。我认为在第二种情况下变量不会过时。这可能是我提交答案的网站的问题吗?

谢谢。

最佳答案

I have heard from a coder that substituting c-string literals causes undefined behaviour.

正确,您不能尝试修改字符串文字。它们通常被编译器放置在只读区域。

指向字符串文字的指针应该用 const 声明以避免未定义的行为:

char const *a = "111"; 
a[0] = '2'; // Ok: compiler error, because assigment to const

However, I do not find a way around like in the following exercise, ...

char* military_time = malloc(9*sizeof(char)); 不会创建字符串文字,所以 military_time[0] = tenner; 没问题。

您可以修改已为其分配内存的内存:

char b[] = "111";      // Create array and initialize with contents copied from literal
b[0] = '2'; // Ok: array can be modified

char *c = malloc(4); // Create pointer which points to malloc'd area
strcpy(c, "111"); // Copy content from literal
c[0] = '2'; // Ok: pointer points to area that can be modified
char* military_time = "12345678";

causes faulty behaviour.

是的,由于上述原因,代码不正确。

关于c - 如何处理替换字符串文字以及为什么在堆上分配很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com