0

我拥有的代码在我拥有的一种方法中非常简单:

// This line has an Intellisense Error: Initialization with {...} expected for aggregate object
char str[] = GetBuffer(); // x 64 will give us 512 (sector sized buffer) ;

GetBuffer 方法是这样的:

char * GetBuffer(void)
{
int idx = 0;
int offset = 0;
char *buffer[512];

for(idx =0; idx < 64; idx ++)
{
            // This line has an Itellisense Error: "Expected Expression"
    buffer[offset + idx] = {"E","R","A","S","E","D"," ", " "};

    offset += 8;
}

return *buffer;
}

任何想法这有什么问题?我要做的就是填充一个 512 字节的缓冲区,其中包含重复的以下字符串:“ERASED”这是 ANSI C(不是 C++),自从我用 ANSI C 编码以来已经很久了 - 请帮助并善待!

使用 Visual Studio 2012

编辑 1 好的,多亏了你们,很多事情已经解决了——但还没有完整的答案。str 缓冲区包含 528 个字符而不是 512 个字符,并且按预期包含很多 ERASED 但以

ýýýý««««««««îþîþ

有什么想法吗?哦,天哪,我还有很多纯 C 阅读要做——我忘记的太多了!

4

3 回答 3

5

您不能使用函数的返回值初始化数组。

您可以使用指针而不是数组:

char *str = GetBuffer();

或者你可以使用strcpy()或一个亲戚——但存在缓冲区溢出风险:

char str[512];

strcpy(str, GetBuffer());

你的GetBuffer()功能也有很多问题。

char *GetBuffer(void)
{
    int idx = 0;
    int offset = 0;
    char *buffer[512];

这应该是char buffer[512];,但是...

    for(idx =0; idx < 64; idx ++)
    {
                // This line has an Itellisense Error: "Expected Expression"
        buffer[offset + idx] = {"E","R","A","S","E","D"," ", " "};

你不能像这样设置数组。char *buffer[512]由于这个问题,你需要双引号。

        offset += 8;
    }

    return *buffer;
}

而且你不应该返回一个局部变量——它在函数返回时被销毁,所以以后不能使用它。

你可能会写:

char *GetBuffer(void)
{
    char *buffer = malloc(257);
    if (buffer != 0)
    {
        int idx;
        for (idx = 0; idx < 256; idx += 8)
            strcpy(buffer+idx, "ERASED  ");
    }
    return buffer;
}

硬编码的长度和限制存在一小层混淆。它们是正确的,但尺寸之间的相互联系并不明显——理想情况下,它们应该是:

  • strlen("ERASED ") == 8
  • 256 = 32 * strlen("ERASED ")
  • 257 = 32 * strlen("ERASED ") + 1(一个是终端空的)

然后调用代码可能是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *str = GetBuffer();

    if (str != 0)
    {
        printf("<<%s>>\n", str);
        free(str);
    }

    return(0);
}
于 2013-08-26T07:35:14.943 回答
1

这里有几件事是错误的。

在 C 中,可以使用初始化列表或字符串文字来初始化字符数组。您不能使用函数的返回值来初始化数组。所以

 char str[] = GetBuffer(); 

不管用。

此外,char* buffer [512]是一个由 512 个指针组成的数组char,即 512 个字符串的数组。buffer [offset + idx]将是一个指向 char 的指针。它只能包含一个字符串,但您尝试为其分配八个字符串:"E""R"等。如果您的意思是chars 而不是字符串,请使用单引号:'E'等。但是,除非您这样做,否则即使这样也行不通为指针分配内存,以便它可以保存字符串。

正如所写,指针数组是在堆栈上分配的,因此当函数终止时它会超出范围。return *buffer将返回字符串数组中的第一个字符串,但这是一个局部变量,因此您将返回不再在范围内的指针的取消引用值。

我认为实现目标的更简单方法是:

char str [512] = {'\0'};

for (int i = 0; i < 511; i += 7)
    strcat (str + i, "ERASED ");

它不是很通用,但它可以满足您的需求。

编辑以反映 Jonathan Leffler 的评论strcat (str, "ERASED "),即我最初拥有的 是低效的。

于 2013-08-26T07:32:30.280 回答
1

您的缓冲区创建有问题。你会malloc这样,它不会被函数调用例程回收。其次,您不能像遇到 Itellisense 错误的行那样进行分配。你可以使用这个:

#include "stdlib.h"

char * GetBuffer(void)
{
    int i = 0, idx = 0;
    const char * cstr_init = "ERASED  ";
    char *buffer = (char*)malloc(512);

    for (idx = 0; idx < 512; idx+=8) {
        for (i = 0; i < 8; i++) {
            buffer[idx+i] = cstr_init[i];
        }
    }

    return buffer;
}
于 2013-08-26T08:25:11.353 回答