C程序中的异常行为,分配内存后变量损坏

时间:2019-01-18 23:36:35

标签: c string malloc

我的C程序中有字符串的typdef,看起来像这样:

Sub UseOfDictionary()
Dim i As Long
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim conditions_in_dict As Scripting.Dictionary
Set conditions_in_dict = New Scripting.Dictionary
conditions_in_dict("cell_IsEmpty") = 0
conditions_in_dict("cell_uncolored") = 0
'here you can enter more keys as conditions as above

For i = 1 To Worksheets.count
    If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_dict("cell_IsEmpty") = conditions_in_dict("cell_IsEmpty") + 1
    If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_dict("cell_uncolored") = conditions_in_dict("cell_uncolored") + 1
Next i
Debug.Print "conditions_in_dict(""cell_IsEmpty""): "; conditions_in_dict("cell_IsEmpty"); vbNewLine; _
"conditions_in_dict(""cell_uncolored""): "; conditions_in_dict("cell_uncolored")

End Sub

然后在某个时候我声明这种类型的动态数组:

HSSFCellStyle dataStyle = currentWorkbook.createCellStyle();
dataStyle.cloneStyleFrom(cell.getCellStyle());
dataStyle.setFont(font);

我使用realloc向该数组添加新字符串:

#define WRD_LEN 100
typedef char cstring[WRD_LEN];

然后向用户显示所有条目,用户选择其中一个并将其传递给另一个功能:

int pcount = 1;
cstring *options = malloc(sizeof(cstring*)*pcount);

mode是一个整数,l是struct,但现在已经不相关了。 btn是用户选择的条目的编号(整数)。 到目前为止,一切正常,问题出现在 highestof 函数中:

options = realloc(options, sizeof(cstring*)*pcount);
strcpy(options[pcount-1], //some string//);
pcount++;

这是列表的定义:

highestof(mode, l, options[btn]);

因此,如果使用 options [1] 调用 highestof 函数,则 cat 变量将被破坏(它将变成一些随机变量符号,例如“#^?”或“ ^ K ^?”),即在调用 malloc 之后,即在创建列表的动态数组之前,我可以使用 cat 需要,但是在调用 malloc 之后,它已损坏。最奇怪的是,只有当传递给该函数的变量位于索引为1( options [btn] 其中 btn < / strong> = 1)对于 btn 的任何其他值,它都没问题。

我找到了解决方法,可以在调用 malloc 之前创建一个字符串(char s [100]),将 cat 值复制到其中,然后使用该变量,但实际上并不能解决最初的问题,这确实困扰着我。

2 个答案:

答案 0 :(得分:3)

sizeof(cstring*)*pcount太小。尺寸计算不正确。


避免分配错误。将此惯用法用于易于正确编写,查看和维护的代码。
请注意,没有使用 type

pointer = malloc(sizeof *pointer * n);

然后代码变为:

// options = malloc(sizeof(cstring*)*pcount);
options = malloc(sizeof *options * pcount);`

答案 1 :(得分:1)

cstring*只是一个指针,通常为四个或八个字节。因此,sizeof (cstring*)很小,通常是四个或八个。

您没有为数据分配足够的内存,只是为容纳指向数据的指针提供了足够的内存。