0

我定义了一个字符数组:

char d[6];

如果我在以下方面有错误,请纠正我:

此时没有为变量分配内存d。现在我要初始化它:

d="aaaaa";

在这种初始化之后,就不需要释放内存了;它会自动完成。

我怎么知道是否char[]已初始化?我正在寻找类似的模式

if (filled(d)){..}

另外,如何用一种字符填充 char[] ?

4

5 回答 5

6

此时没有为变量 d 分配内存。

不正确。这个:

char d[6];

是一个未初始化的 6 chars 数组,并且已为其分配了堆栈上的内存。堆栈变量不需要显式free()d,无论它们是否已初始化。堆栈变量使用的内存将在超出范围时被释放。只有通过malloc(), realloc()or获得的指针才calloc()应该传递给free().

初始化:

char d[6] = "aaaaa"; /* 5 'a's and one null terminator. */

或者:

char d[] = "aaaaa"; /* The size of the array is inferred. */

而且,正如mathematician1975已经指出的那样,数组赋值是非法的:

char d[] = "aaaaa"; /* OK, initialisation. */
d = "aaaaa";        /* !OK, assignment. */

strcpy(), strncpy(), memcpy(),snprintf()等可用于d在声明后复制到,或分配chard.


如何知道 char[] 是否已初始化?如果填充(d){..},我需要模式

如果数组为空终止,您可以使用strcmp()

if (0 == strcmp("aaaaaa", d))
{
    /* Filled with 'a's. */
}

或使用memcmp()if not null 终止:

if (0 == memcmp("aaaaaa", d, 6))
{
    /* Filled with 'a's. */
}

如何用一种字符填充 char[]?

使用memset()

memset(d, 'a', sizeof(d)); /* WARNING: no null terminator. */

或者:

char d[] = { 'a', 'a', 'a', 'a', 'a', 'a' }; /* Again, no null. */
于 2012-07-24T13:53:14.073 回答
1

如果您这样做,您的代码将无法编译(gcc 4.6.3)

 char d[6];
 d = "aaaaa";

你需要做

 char d[6] = "aaaaa" 

以这种方式初始化它。这是在堆栈上创建的局部变量,因此就内存问题而言,您需要担心的不是超出数组边界的写入/读取。

于 2012-07-24T13:54:33.273 回答
0
How to know was char[] initialized? I need pattern if filled(d){..}

只需在声明字符数组时执行此操作:

char d[6];
d[0] = 0;

然后你可以像这样检查:

if(strlen(d) == 0)
//d is not initialized
于 2012-07-24T14:00:17.030 回答
0

首先,每当您声明char d[6]已经分配了 6 个字节的内存时。

其次,除非你做 malloc,否则不需要释放你的内存

第三,如果你想用一种字符初始化它,那么这样做

char d[6] = "aaaaa"; 
于 2012-07-24T13:52:46.540 回答
0
int d[6];

使用此声明将 6 个字节分配到堆栈上。它将被自动释放。

于 2012-07-24T14:00:05.580 回答