2011-05-14 74 views
4
char* foo = (char*) malloc(sizeof(char)*50); foo = "testing"; 

在C中,我可以看到该字符串的第一个字符:更改字符数组的价值观

printf("%c",foo[0]); 

但是,当我试图改变该值:

foo[0]='f' 

它给错误在运行时。

我该如何改变这个动态分配的char数组的值?

回答

8

您正在将foo设置为指向字符串文字("testing")而不是您分配的内存。因此,您正尝试更改常量的只读内存,而不是分配的内存。

这是正确的代码:

char* foo = malloc(sizeof(char)*50); 
strcpy(foo,"testing"); 

甚至更​​好

cont int MAXSTRSIZE = 50; 
char* foo = malloc(sizeof(char)*MAXSTRSIZE); 
strncpy(foo,"testing",MAXSTRSIZE); 

防止缓冲区超限运行的脆弱性。

+3

不要投你的malloc。 char * foo = malloc(sizeof(char)* MAXSTR); – zellio 2011-05-14 16:27:36

+0

@Mimisbrunnr - 当然。 – Hogan 2011-05-14 18:17:05

1

使用字符串时,不应通过赋值运算符(=)赋值。这是因为字符串不是实际的类型,它们只是字符指针。相反,你必须使用strcpy

您的代码存在的问题是您已为foo分配了内存,然后您将foo重新分配给了另一个READONLY内存地址。当您分配给foo[0]时,您会遇到运行时错误,因为您正在尝试写入只读内存。

通过这样做修复您的代码:

char* foo = malloc(50); 
strcpy(foo, "testing"); 

这工作,因为foo指向你分配的地址。

+0

如果为foo [0]赋值意味着重新赋值变量,那么赋值给foo [1]是什么意思? – 2011-05-14 16:21:11

+0

@gcx - 同样的事情只是指向常量字符串中的'e'而不是't'。 – Hogan 2011-05-14 16:23:16

+1

不,'foo =“testing”'将变量重新分配给一个地址(与您分配的地址不同)。 – Marlon 2011-05-14 16:23:20

2

你的问题是你正在改变指针引用。

这样做:

char* foo = (char*) malloc(sizeof(char)*50); foo = "testing"; 

您分配富指针到某处存储"testing"字符串(母鸡运行时错误我猜的),而不是新分配的空间。

希望这会有所帮助