假设我有一个char * str,并且我希望使用指针并递增来逐个分配字符?使用指针将字符赋给char *
我做:
char *str;
char c = 'a';
*str++ = c;
但它不工作。
我该怎么做?
假设我有一个char * str,并且我希望使用指针并递增来逐个分配字符?使用指针将字符赋给char *
我做:
char *str;
char c = 'a';
*str++ = c;
但它不工作。
我该怎么做?
str
只是一个指针。它没有指向任何有效的地方(尤其是不能指向你可以写入的某些内存)。一个简单的可能性是把它指向的数组:
char buf[1024] = {0}; // room for 1024 chars (or 1023 + a 0 byte for a string)
char *str = buf;
char c = 'a';
*str++ = c;
char *str
是指向一个char(或字符数组),然而,就从未分配它。如前所述,char *
基本上说“去那里”,但那里没有,你从来没有给它一个价值。首先,您需要使用malloc
创造空间放东西的。这里有一个例子
char *str = malloc(sizeof(char)*10) //allocate space for 10 chars
char c = 'a';
str[0] = c;
没有错误检查是对malloc,你应该在自己的程序做制造。你也可以做这样
char str[10];
char c = 'a';
str[0] = c;
但是用这种方法,你将被限制在10个字符,你不能改变的金额,你可以使用realloc
阵列中获得更多或更少的空间以前的方法。
但它不起作用。
char* str;
...未初始化任何东西,因此取消引用它是不确定的行为。如果它已初始化,则在表达式*str++ = c;
中,str ++是后增加运算符,它在返回指针副本的同时递增原始数据。结果是副本指向前一个,因此前一个指针指向的内容被分配给c。
你指的是哪部分不起作用?
编辑:
正如在评论中提及了,是不是真的返回一个副本,但已被评估后的价值增值到位。
它不会“返回副本”。 '++'操作符修改对象(在这里是指针)。它*在*递增前评估*值*。 –
@FelixPalmen,在内建类型的情况下,这是真的,是的,但我想概念化是通过解释它为非内置的 –
这是C.没有(用户)重载操作符。 –
作为具有自动存储持续时间的变量,指针str
具有不确定的值。如果它有静态存储持续时间,它的值将为NULL。所以你可能不会使用这样的指针来存储数据。
你的意思是什么可以期待例如通过以下方式
#include <stdio.h>
int main(void)
{
char s[11];
char *p = s;
while (p != s + sizeof(s)/sizeof(*s) - 1) *p++ = 'a';
*p = '\0';
puts(s);
return 0;
}
程序输出是
aaaaaaaaaa
在这里,在节目类型char *
的指针p
由的地址初始化数组的第一个字符s
。
因此,在循环
*p++ = 'a';
使用该语句顺序填充以字符'a'
阵列。
下一个例子是更有趣
#include <stdio.h>
char * copy_string(char *dsn, const char *src)
{
for (char *p = dsn; (*p++ = *src++) != '\0';)
{
// empty body
}
return dsn;
}
int main(void)
{
char *src = "Hi QBl";
char dsn[7];
puts(copy_string(dsn, src));
return 0;
}
程序输出是
Hi QBl
这里是一个函数的一种证明,拷贝包含字符串转换成使用指针另一个字符阵列的一个字符阵列。
做什么?你知道吗?为什么它不起作用? –
它不起作用,因为'str'指向没有确定。那里没有“那里”。 – WhozCraig
我喜欢*的结构*没有“那里”*句子... –