Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct 我的C结构和内存分配正确吗?_Struct_Dynamic Allocation_Calloc - Fatal编程技术网

Struct 我的C结构和内存分配正确吗?

Struct 我的C结构和内存分配正确吗?,struct,dynamic-allocation,calloc,Struct,Dynamic Allocation,Calloc,不确定我是否有正确的语法;我的代码正在运行,只是想运行它,让任何人都不想评论,以帮助改进它。我假设分配20480不会占用任何空间,因为它只是一个指针数组?所以我可以让它变成任何大于dwStringsFound的数字 struct sArray { TCHAR *sName; }*sKeys[20480]; // get dwStringsFound... [...] // allocate the space for (DWORD

不确定我是否有正确的语法;我的代码正在运行,只是想运行它,让任何人都不想评论,以帮助改进它。我假设分配20480不会占用任何空间,因为它只是一个指针数组?所以我可以让它变成任何大于dwStringsFound的数字

    struct sArray   {
    TCHAR *sName;
    }*sKeys[20480];

    // get dwStringsFound...
    [...]

    // allocate the space
    for (DWORD i=0;i<dwStringsFound;i++) sKeys[i] = (sArray *) calloc(1,sizeof(sArray));
    for (DWORD i=0;i<dwStringsFound;i++) sKeys[i]->sName = tcalloc(1024);

    // Do work...
    [...]

    // Free resources.
    for (DWORD i=0;i<dwStringsFound;i++)    {
    free(sKeys[i]->sName);sKeys[i]->sName=NULL;
    free(sKeys[i]);sKeys[i]=NULL;
    }
struct-sArray{
TCHAR*sName;
}*sKeys[20480];
//获取dwStringsFound。。。
[...]
//分配空间
对于(DWORD i=0;isName=NULL;
free(sKeys[i]);sKeys[i]=NULL;
}

TCHAR*是一个指针,为什么你不能直接做TCHAR*sName[20480]静态分配是很好的,但它不是最有效的内存。在将来,你可能想考虑分配*sSKEY作为数组的数组,其中DWStRunsScript是数组的大小。如果你在程序的某个时候调用一个深度递归函数,你可能会遇到RU。n堆栈外内存。请记住,堆内存总是比堆栈内存多。如果你不打算在整个程序中使用某个东西,它可能应该被malloc'ed并释放。如果它只是静态分配的,它只是在超出其使用寿命后浪费空间。

什么是tcalloc?我找不到任何引用。任何这样,sKeys[20480]肯定会占用空间,但不会占用堆上的空间。tcalloc:#定义tcalloc(nCharacters)(TCHAR*)calloc(nCharacters,sizeof(TCHAR))如何让sKeys使用堆而不是堆栈?@jeff定义结构[
struct-sArray{TCHAR*sName;};
],定义指针[
struct-sArray*sKeys=NULL;
],并在知道需要多少时调用它[
sKeys=calloc(dwStringsFound,sizeof(*sKeys));
]最后。请注意,
NULL
sKeys
的取消引用在sizeof上下文中不是未定义的行为,而是其他行为。您还应该对
calloc
的返回值进行错误检查。我需要一个包含元素sName的数组。