假设我有一个 char *str ,我想使用指针和递增来按时间给它分配一个字符?
我已经完成了:
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 *
基本上表示“去那里”,但那里并不存在,你从未给它一个值。您首先需要使用 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。
您指的是哪一部分不起作用?
编辑:
正如评论之一中提到的,副本并未真正返回,但值在评估后会就地递增。
作为具有自动存储期限的变量,指针
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
在程序中,
p
类型的指针char *
由数组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
这里演示了一个函数,该函数使用指针将一个包含字符串的字符数组复制到另一个字符数组中。
要将字符串 1 的每个字符分配给字符串 2 的每个字符,应为字符串 2 的指针变量分配相等的长度。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str = "Hello, world!";
char *p = (char*)malloc(sizeof(char) * strlen(str));
*p = '\0';
char *pHead = p;
printf("*str = %s\n", str);
printf("*p = %s\n", pHead);
while(*str != '\0')
{
*p = *str;
str++;
p++;
}
printf("*p = %s\n", pHead);
}
输出为:
*str = Hello, world!
*p =
*p = Hello, world!