在SFunction中使用malloc时出错

时间:2015-08-07 14:23:00

标签: c matlab malloc mex s-function

我正在开发一个C-MEX SFunction以与simulink集成。这里的目标是将ascii代码数组转换为double。在打开matlab之前,我使用Visual Studio实现了一个测试代码,它可以正常工作。 (见下文)

#include "stdafx.h"
#include "stdlib.h"
#include <stdio.h>
#include <math.h>
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double finalDouble;
    size_t len = 1;
    char* concatenation;
    double character2 = 54; // 6 in ascii
    double character1 = 46; // dot in ascii
    double character0 = 51; // 3 in ascii

    int character2_int = (int)(character2);
    int character1_int = (int)(character1);
    int character0_int = (int)(character0);

    char buffer2[1];
    char buffer1[1];
    char buffer0[1];

    sprintf(buffer2,"%c",character2_int);
    sprintf(buffer1,"%c",character1_int);
    sprintf(buffer0,"%c",character0_int);

    concatenation = (char*)malloc(len+len+len);
    strcpy(concatenation, buffer2); /* copy into the new var */
    strcat(concatenation, buffer1); /* concatenate */
    strcat(concatenation, buffer0); /* concatenate */

    finalDouble = atof(concatenation); // final double must be 6.3

    //y0[0] = finalDouble;
}

在VisualStudio中测试完所有内容后,我在matlab中复制到了SFunction Builder。它不会崩溃,但看起来像malloc没有按预期工作。 预期输出为6.3(双倍),但我只得到最后一位数3(双)

有谁知道发生了什么事?有什么建议吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

您在一个字节缓冲区上使用sprintf,而缓冲区的大小至少应为2.并且您没有为malloc分配足够的内存。这导致了不确定的行为。

更改:

char buffer2[1];
char buffer1[1];
char buffer0[1];
...
concatenation = (char*)malloc(len+len+len);

char buffer2[2];
char buffer1[2];
char buffer0[2];
...
concatenation = (char*)malloc(len+len+len+1);

对于这么简单的任务,您的代码非常奇怪和复杂。你究竟想要实现什么? ?

答案 1 :(得分:1)

您的麻烦在于您没有区分单个字符(char)和字符串(char[])。 从上到下:

1)您可以使用单引号分配ASCII值:

double character2 = '6';
double character1 = '.';
double character0 = '3';

2)字符串以空字符结尾,这意味着保存n个字符串所需的字节数为n + 1。因此,至少需要两个字节才能将单个字符存储为字符串。

3)sprintf存储一个字符串,这意味着它在最后一个char之后存储一个终止空字符:

sprintf(buffer2,"%c",character2_int); 将单个字节从character2_int复制到buffer2,然后将终止空字符(十进制0)写入RAM地址&buffer2 + 1

4)strcpy()strcat()处理字符串,而不是单chars。他们将继续复制/连接chars,直到他们找到终止空字符。同样,不要忘记分配足够的空间来包含终止空字符。