从方法返回中填充缓冲区失败... ANSI C

Dav*_*don 0 c buffer ansi

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

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

GetBuffer metod是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

有什么想法这有什么不对吗?所有我想做的 - 填充一个512字节的缓冲区,其中包含重复的以下字符串:"ERASED"这是ANSI C(而不是C++)并且它已经很长时间以来我用ANSI C编码 - 请帮助和善待!

使用Visual Studio 2012

编辑1 好的很多东西已经修复,感谢你们 - 但还没有完整的答案.str缓冲区包含528个字符而不是512,并且包含大量的ERASED,但是以#结尾

YYYY««««««««îþîþ

有这个想法吗?哦,男孩,我有很多纯C读书要做 - 我已经忘了太多了!

Jon*_*ler 5

您无法使用函数的返回值初始化数组.

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

char *str = GetBuffer();
Run Code Online (Sandbox Code Playgroud)

或者你可以使用strcpy()或亲戚 - 但有缓冲区溢出风险:

char str[512];

strcpy(str, GetBuffer());
Run Code Online (Sandbox Code Playgroud)

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

char *GetBuffer(void)
{
    int idx = 0;
    int offset = 0;
    char *buffer[512];
Run Code Online (Sandbox Code Playgroud)

这应该是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"," ", " "};
Run Code Online (Sandbox Code Playgroud)

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

        offset += 8;
    }

    return *buffer;
}
Run Code Online (Sandbox Code Playgroud)

并且您不应该返回一个局部变量 - 它在函数返回时被销毁,因此之后不能使用它.

你可以写:

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;
}
Run Code Online (Sandbox Code Playgroud)

使用硬编码的长度和限制进行了一小部分混淆; 它们是正确的,但尺寸之间的相互关系并不明显 - 理想情况下,它们应该是:

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

然后调用代码可能是:

#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);
}
Run Code Online (Sandbox Code Playgroud)