C中的结构问题

2 c

我的结构如下:

typedef struct {
      unsigned long attr;
      char fileName[128];
} entity;
Run Code Online (Sandbox Code Playgroud)

然后我尝试分配一些值,但得到一条错误信息......

int attribute = 100;
char* fileNameDir = "blabla....etc";

entity* aEntity;

aEntity->attr = attributes;
aEntity->fileName = fileNameDir;
Run Code Online (Sandbox Code Playgroud)

编译告诉我:

错误:#137:表达式必须是可修改的左值aEntity-> fileName = fileNameDir;

为什么我不能在这里将这个角色分配给结构中的那个角色?

谢谢

sha*_*oth 11

您不能指定指向数组的指针.使用strncpy()复制字符串:

strncpy( aEntity->fileName, fileNameDir, 128 );
Run Code Online (Sandbox Code Playgroud)

如果源长度超过128,这将使目标不为空终止.我认为最好的解决方案是使用一个更大的缓冲区,仅复制N个字节并将第N + 1个字节设置为零:

#define BufferLength 128

typedef struct {
  unsigned long attr;
  char fileName[BufferLength + 1];
} entity;

strncpy( aEntity->FileName, fileNameDir, BufferLength );
*( aEntity->FileName + BufferLength ) = 0;
Run Code Online (Sandbox Code Playgroud)

  • @Casey:假设您需要为字符串连接分配缓冲区.你是否真的认为1为尾随零是一个神奇的数字? (2认同)

sbi*_*sbi 11

  • 你将char[](和一个char*,FTM)视为一个字符串.哪个不是.您无法分配数组,您必须复制值.此外,文件名的长度128似乎是任意的,可能是缓冲区溢出的潜在来源.使用有什么问题std::string?这可以摆脱所有这些问题.
  • 您正在定义指向某些指针entity,不初始化它,然后使用它,就好像它指向的随机地址是有效entity对象一样.
  • 在C++中不需要typedefa struct,因为与C不同,C++ struct名称与其他名称存在于同一名称空间中.

如果您绝对必须使用struct问题中定义的(它是预定义的),那么请查看其他答案并获得"C编程语言".否则,您可能想要使用此代码:

struct entity {
  unsigned long attr;
  std::string fileName;
};

entity aEntity;
aEntity.attr = 100;
aEntity.filename = "blabla....etc";
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

您应该复制文件名字符串,而不是更改它指向的位置.


Sin*_*nür 5

你在写C或C++吗?没有一种称为C/C++的语言,根据您使用的语言,您的问题的答案会有所不同.如果您使用的是C++,则应该使用std::string而不是普通的旧C字符串.

您的代码中存在一个主要问题,我没有看到其他海报地址:

entity* aEntity;
Run Code Online (Sandbox Code Playgroud)

声明aEntity(应该anEntity)作为指向a的指针,entity但它没有被初始化.因此,像所有未初始化的指针一样,它指向垃圾.因此:

aEntity->attr = attributes;
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为.

现在,给定一个正确的初始化anEntity,anEntity->fileName是一个数组,而不是指向字符数组的指针(参见C FAQ列表中的问题6.2).因此,您需要将指向的字符串复制到fileNameDir为其保留的内存块anEntity->fileName.

我看到很多建议要使用strncpy.我不是一个想要strncpy更安全的替代者的支持者,strcpy因为它确实不是.另见为什么strncpy不安全?

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

typedef struct st_entity {
    unsigned long attr;
    char fileName[FILENAME_MAX + 1];
} entity;

int main(void) {
    int status = EXIT_FAILURE;
    unsigned long attribute = 100;
    char *fileNameDir = "blabla....etc";

    entity *anEntity = malloc(sizeof(*anEntity));

    if ( anEntity ) {
        anEntity->attr = attribute;
        anEntity->fileName[0] = '\0';
        strncat(anEntity->fileName, fileNameDir, sizeof(anEntity->fileName) - 1);
        printf("%lu\n%s\n", anEntity->attr, anEntity->fileName);
        status = EXIT_SUCCESS;
    }
    else {
        fputs("Memory allocation failed", stderr);
    }

    return status;
}
Run Code Online (Sandbox Code Playgroud)

strncat.