假设我要使用函数修改char数组。 我总是看到人们使用malloc,calloc或指针来修改int,char或2D数组。 我说对了,只有在我使用malloc,创建该数组指针并返回他的情况下,才能从函数返回该字符串吗?那为什么不通过传递给函数参数来获取/改变字符串呢? 我的演示(在参数中使用char数组)是否比分配/释放更容易?我的概念是错误的,还是为什么我从来没有看到人们传递数组来起作用?当我看到这种容易改变char数组的方法时,我只看到通过诸如“ char * array”而不是“ char array []”的代码,使用malloc等。我想念什么吗?
#include <stdio.h>
void change(char array[]){
array[0]='K';
}
int main(){
char array[]="HEY";
printf("%s\n", array);
change(array);
printf("%s\n",array );
return 0;
}
答案 0 :(得分:3)
如果您仅需要更改字符串中的现有字符,并且该字符串将位于变量中,并且您不介意修改原始字符串的副作用,那么您的解决方案可能是可以接受的,实际上确实更容易。但是:
如果您想获得修改后的字符串,但又想保留原始字符串怎么办?为避免破坏任意大小的原件,您需要malloc
空间,进行复制并进行修改。
如果要扩展字符串怎么办?如果您的更改是在字符串中添加“ YOU”,则由于没有空格,因此无法修改原始字符串,这将导致buffer overflow,因为只有4个字节分配给“ HEY”(三个字母加上空终止符)。同样,该解决方案还涉及malloc
的可用空间。
使用您的技术进行更改的函数通常需要一个size
或length
参数,以避免数组溢出并导致崩溃和潜在的安全风险。但是,尽管这样做可以避免溢出,但是仍然存在以下问题:如果没有足够的空间,该怎么办:静默删除一些数据?传回一个标志或特殊值以指示没有足够的空间,并希望调用者来处理它?从长远来看,第一次写就更容易了,malloc
/ calloc
的空间并在以后不得不释放它以及所有这些处理。