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)
sbi*_*sbi 11
char[](和一个char*,FTM)视为一个字符串.哪个不是.您无法分配数组,您必须复制值.此外,文件名的长度128似乎是任意的,可能是缓冲区溢出的潜在来源.使用有什么问题std::string?这可以摆脱所有这些问题.entity,不初始化它,然后使用它,就好像它指向的随机地址是有效entity对象一样.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)
你在写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.