0

我在以下代码中收到分段错误(核心转储):

void Update_Log( )
{
        struct logData update;
        int file;

        char *writeBuffer=NULL;

        if((file=creat("/home/user/Desktop/DMS/DMS/filename.txt",O_RDONLY|O_WRONLY))==-1)
                perror("file not opened");
        update.clientName="user";
        update.filename="user";
        update.timestamp="some time";
        sprintf(writeBuffer,"%s %s %s",update.clientName,update.filename,update.timestamp);


        if((write(file,writeBuffer,sizeof(writeBuffer)))==-1)
                perror("write unsuccessful");
        close(file);
}

我的结构如下:

struct logData
{
        char *clientName;
        char *filename;
        char *timestamp;
};

有人可以帮忙吗?

4

7 回答 7

2

您正在尝试写入writeBuffer哪个是空指针,您应该将其声明为数组(1),或者在堆(2)上为其分配内存。

  1. char writeBuffer[100];
  2. char *writeBuffer=malloc(100)

在这两种情况下,您都不应该使用sprintf,但snprintf要确保您没有溢出缓冲区。

于 2012-08-20T08:46:27.037 回答
0

创建“更新”时,它只为字符串 clientName、filename、timestamp 的指针分配空间;它不为字符串本身分配空间。一个快速的技巧是做一些类似 update.clientName = (char*)malloc(sizeof(char)*len) 的事情,其中​​ len 是你想要分配的长度。那么你真的应该检查那个调用的返回码......

这与写缓冲区的问题完全相同……您只需要确保为所有字符串分配空间。

于 2012-08-20T08:47:54.680 回答
0

错误是这两行:

char *writeBuffer=NULL;

/* ... */

sprintf(writeBuffer, /* ... */);

在这里你写入一个NULL指针。

而是创建一个数组,例如

char writeBuffer[32];
于 2012-08-20T08:49:12.073 回答
0

您需要为 writeBuffer 分配空间。

您可以使用 malloc,或者如果您对数据的大小有限制(例如,如果它小于 256 字节),只需将其声明为

char writeBuffer[256];

我还建议查找并使用 snprintf 而不是 sprintf 以确保数据不会跑完。

于 2012-08-20T08:50:20.570 回答
0

您的结构仅存储指针,没有为实际数据分配内存。要么你应该有

struct logData
{
        char clientName[SOMEDEFINE1NUMBERHERE];
        char filename[SOMEDEFINE2NUMBERHERE];
        char timestamp[SOMEDEFINE3NUMBERHERE];
};

或者你分配内存 ( malloc)

update.clientname = (char *)malloc(SOMEDEFIN1NUMBERHERE); strncpy(update.clientname, "用户");

于 2012-08-20T08:51:19.813 回答
0

正如 Binyamin Sharet 所写sprintf的那样,没有分配输出缓冲区。调用者必须提供足够长的输出缓冲区。这并不总是那么简单。因此,我建议您使用fopen而不是open. 然后你可以这样编码:

void Update_Log( )  
{  
        struct logData update;  
        FILE *file = fopen("/home/user/Desktop/DMS/DMS/filename.txt", "w");  

        if(file==NULL) {  
                perror("file not opened");  
                return;
        }
        update.clientName="user";  
        update.filename="user";  
        update.timestamp="some time";  
        if(fprintf(file,"%s %s %s",update.clientName,update.filename,update.timestamp) < 0)  
                perror("write unsuccessful");  
        fclose(file);  

}

As you can see the code is shorter and it has no potential buffer overflow.

于 2012-08-20T08:57:53.420 回答
-1

它崩溃了,因为writeBufferNULL.

您需要为writeBuffer使用 malloc 分配内存 - 使用strlen(例如)来计算必要的空间(不要忘记\0和中的空格sprintf)。

或者,您可以自动分配一些固定大小的数组:

char writeBuffer[ SOME_SIZE_BIG_ENOUGH ];

此外,您不应该这样做:

    update.clientName="user";
    update.filename="user";
    update.timestamp="some time";

你有几个选择:

  • 采用strcpy
  • 使用strdup(POSSIX)
  • 做指针const char*,不只是char*
于 2012-08-20T08:48:56.473 回答