这里的新手总数。 我试图替换char *中的字符,但我的程序出错
#include <stdio.h>
int main(int argc, char **argv)
{
char *mystring ="love is alweys better yoe";
int count = 1;
for (count ; count < 23; count++)
{
if ((mystring[count] == 0x65 )) //&& ((mystring[count+1] > 0x41) && (mystring[count+1] < 0x7A)))
{
mystring[count] = 0x45; //here occur the freezing
printf ("%c\n", mystring[count]);
//break;
};
};
printf("%s\n",mystring);
return 0;
}
答案 0 :(得分:10)
char *mystring ="love is alweys better yoe"
使mystring成为只读
您需要先将字符串复制到缓冲区中才能进行更改
e.g。
char mystring[128];
strcpy( mystring , "love is alweys better yoe" );
答案 1 :(得分:9)
筹码分配
char *mystring ="love is alweys better yoe";
这会在只读内存中创建一个字符串文字,您不能随后写入它来更改字符。
你应该像这样初始化你的字符串:
char mystring[] ="love is alweys better yoe";
这将分配一个大小为26字节的字符数组 - 每个字符1个字节,以空字符\0
结束。
请注意,如果您尝试写入缓冲区的末尾(即超出\0
字符),则可能会入侵为程序中的其他数据分配的内存,这可能会产生不良后果。< / p>
堆分配
前面的示例在堆栈上分配内存,并且在当前范围的末尾(通常是您所在的函数)将被释放。如果你希望内存在函数调用结束后持续存在,你需要在堆上分配它,如下所示:
int bufferSize = 26;
char* mystring = malloc(bufferSize);
strncpy(mystring, "love is alweys better yoe", bufferSize);
当你完成它时,你需要记住free
这段记忆:
free(mystring);
如果free
来自调用函数,则需要将char*
指针返回给调用者,因此它知道free
的哪个内存位置。如果你没有free
这个内存,你的程序将泄漏内存。
增加字符串的大小
如果您需要在为其分配内存后重新调整字符串大小,可以使用realloc
:
char* mybiggerString = realloc(mystring, bufferSize + 10);
strncpy(mystring, "I can fit more in this string now!", bufferSize);
答案 2 :(得分:5)
当您撰写char *mystring ="love is alweys better yoe";
时,会导致mystring
指向字符串文字。这是一块专门用于保存文本的内存。记忆的特殊区域可能无法更改。 (文本存储在.exe文件中;在大多数实现中,操作系统将.exe文件加载到内存中,然后将指针指向加载的.exe的那部分。您可能不会更改此内存,因为操作系统禁止它 - 基本上,要使创建病毒变得更加困难。)
解决方案:使用可修改的内存块。这样写:char mystring[] = "love is alweys better yoe";
。字符串文字仍将存在于您的程序中,但这会指示程序创建一个缓冲区(在内存中可以更改)并将文字复制到缓冲区中。此缓冲区的长度与文字的长度完全相同,因此您仍然可能不会将附加到字符串 - 只更改现有字符,或将其剪切掉(通过在中间某处写入空字节)。