我正在尝试创建一个从main函数更改char数组的函数,这就是我正在尝试做的事情:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void change(char *a);
int main()
{
char a[] = "hello";
printf("\na = %s", a);
change(a);
printf("%\na = %s", a);
getch();
}
void change(char *a)
{
a = "goodbye";
}
答案 0 :(得分:9)
此代码存在一些问题,但首先我们需要退一步讨论如何在C中处理数组。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,表达式为&#34; N元素数组T
&#34;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T
&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。
在声明中
char a[] = "hello";
"hello"
是一个字符串文字,其类型为&#34; 6个元素的数组char
&#34; (5个字符加0终结符)。由于它用于在声明中初始化数组a
,因此上述规则不适用;相反,a
的大小设置为与文字(6)的大小相同,并且字符串文字的内容被复制到数组。
当您从change
致电main
change(a);
表达式 a
具有char
&#34;的类型&#34; 6元素数组。由于它既不是字符串文字也不是sizeof
或一元&
运算符的操作数,因此该表达式将转换为&#34;指向char
&#34;的指针,并且表达式的值将是aray的第一个元素的地址。因此,change
函数被声明为
void change(char *a);
在这种情况下,a
只是一个指针。当你写
a = "goodbye";
字符串文字"goodbye"
未在初始化程序中使用,并且它不是sizeof
或一元&
运算符的操作数,因此表达式转换为type&#34;指向char
&#34;的指针,表达式的值是第一个字符的地址。那么这里发生的是您将字符串文字"goodbye"
的地址复制到a
。这会覆盖a
中的值,但此a
与a
中的数组 main
不是内存中的对象,因此任何更改它没有反映在main
中。
如果要更新数组的内容,则需要使用库函数strcpy/strncpy
(对于以0结尾的字符串)或memcpy
(对于所有内容) else),或明确更新每个元素(a[0]='g'; a[1]='o'; a[2]='o';
等)。
要更新a
的内容,请使用
strcpy( a, "goodbye" );
<强>除强> ...
a
只能容纳5个字符和0个终结符; "goodbye"
是7个字符加0终结符;它的两个字符大于a
能够存储的字符。 C将很乐意让您执行操作并在a
之后立即删除字节,这可能会导致任何数量的问题(缓冲区溢出,例如这是一种典型的恶意软件攻击)。在这个时刻,你有几个选择:
首先,您可以声明a
足够大以处理任一字符串:
#define MAX_LEN 10
...
char a[MAX_LEN] = "hello";
其次,您可以限制复制到a
的字符串的大小:
void change( char *a, size_t size )
{
strncpy( a, "goodbye", size - 1 );
a[size - 1] = 0;
}
请注意,当您致电a
时,您需要传递change
可以存储的元素数量作为单独的参数;没有办法从指针告诉它指向的数据有多大:
change( a, sizeof a / sizeof *a ); // although in this case, sizeof a would be
// sufficient.
答案 1 :(得分:-2)
主要问题是你通过这样做发送了一个char charinteur a的副本:
void change(char *a)
{
a = "goodbye";
}
如果你想改变其他功能中的值,你应该这样做:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void change(char **a);
int main()
{
char *a = "hello";
printf("\na = %s", a);
change(&a);
printf("%\na = %s", a);
getch();
}
void change(char **a)
{
*a = "goodbye";
}
答案 2 :(得分:-2)
我改变了功能,现在它可以这样工作:
void change(char *a)
{
strcpy(a, "goodbye");
}