2017-10-05 76 views
-2

假设我有一个char * str,并且我希望使用指针并递增来逐个分配字符?使用指针将字符赋给char *

我做:

char *str; 
char c = 'a'; 
*str++ = c; 

但它不工作。

我该怎么做?

+0

做什么?你知道吗?为什么它不起作用? –

+4

它不起作用,因为'str'指向没有确定。那里没有“那里”。 – WhozCraig

+2

我喜欢*的结构*没有“那里”*句子... –

回答

3

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; 
2

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阵列中获得更多或更少的空间以前的方法。

1

但它不起作用。

char* str; 

...未初始化任何东西,因此取消引用它是不确定的行为。如果它已初始化,则在表达式*str++ = c;中,str ++是后增加运算符,它在返回指针副本的同时递增原始数据。结果是副本指向前一个,因此前一个指针指向的内容被分配给c。

你指的是哪部分不起作用?

编辑:

正如在评论中提及了,是不是真的返回一个副本,但已被评估后的价值增值到位。

+1

它不会“返回副本”。 '++'操作符修改对象(在这里是指针)。它*在*递增前评估*值*。 –

+0

@FelixPalmen,在内建类型的情况下,这是真的,是的,但我想概念化是通过解释它为非内置的 –

+0

这是C.没有(用户)重载操作符。 –

1

作为具有自动存储持续时间的变量,指针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 

这里是一个函数的一种证明,拷贝包含字符串转换成使用指针另一个字符阵列的一个字符阵列。