我的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 值复制到其中,然后使用该变量,但实际上并不能解决最初的问题,这确实困扰着我。
答案 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*)
很小,通常是四个或八个。
您没有为数据分配足够的内存,只是为容纳指向数据的指针提供了足够的内存。