小编bro*_*ng0的帖子

free()将内存归零吗?

直到今天,我仍然相信,调用free()内存空间会释放它以供进一步分配而无需任何其他修改.特别是,考虑到这个SO问题清楚地表明free()不会将内存归零.

但是,让我们考虑这段代码(test.c):

#include<stdlib.h>
#include<stdio.h>

int main()
{
    int* pointer;

    if (NULL == (pointer = malloc(sizeof(*pointer))))
        return EXIT_FAILURE;

    *pointer = 1337;

    printf("Before free(): %p, %d\n", pointer, *pointer);

    free(pointer);

    printf("After free(): %p, %d\n", pointer, *pointer);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

编译(GCC和Clang):

gcc test.c -o test_gcc
clang test.c -o test_clang
Run Code Online (Sandbox Code Playgroud)

结果:

$ ./test_gcc 
Before free(): 0x719010, 1337
After free(): 0x719010, 0
$ ./test_clang
Before free: 0x19d2010, 1337
After free: 0x19d2010, 0
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我一直生活在谎言中还是我误解了一些基本概念?还是有更好的解释?

一些技术信息:

Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 …
Run Code Online (Sandbox Code Playgroud)

c free gcc memory-management clang

35
推荐指数
6
解决办法
4740
查看次数

打印unsigned long long int值类型返回奇怪的结果

我在使用printf函数打印类型值时遇到问题unsigned long long int

我不知道出了什么问题.我在Windows 7 Professional 64位上使用Dev-Cpp 4.9.9.2和Visual Studio 2010 Professional(我知道它不是C编译器,但无论如何,想要尝试).为了显示,我使用了%llu修饰符(根据你如何printf一个unsigned long long int(unsigned long long int的格式说明符)?)但是我也尝试了I64d没有效果......


首先,我只是想打印的最小值和最大值unsigned long long int(使用ULONG_MAX来自limits.h)

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
Run Code Online (Sandbox Code Playgroud)

返回:

unsigned long long int:18446744069414584320 to 1580552164021 (Dev-Cpp)

unsigned long long int:18446744069414584320 to 0 (Visual Studio)


然后我尝试使用printf打印两个零

printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回:

unsigned long long int:0到1580552164021 (Dev-Cpp) …

c syntax printf unsigned-long-long-int

11
推荐指数
2
解决办法
1万
查看次数

使用在C++中创建的DLL从Excel和VBA调用C++函数

我创建了一个包含名为"koduj"的函数的DLL.通过在Excel工作表单元格中使用它来调用此函数将返回所需的结果.从VBA调用"koduj"会返回错误的答案.

koduj需要两个参数:string nr_idinteger x1.它nr_id以ASCII表示形式计算字母的总和并添加x1.计算的总和不是返回的.

我按照这里的说明进行操作.

这是我的.cpp源文件:

#include<Windows.h>
#include<string>
using namespace std;


//Convert BSTR to wstring for convenience
wstring BSTR_to_wstring (BSTR text){
    return wstring(text, SysStringLen(text));
}

//Calculate sum of letters in ASCII representation
int ASCII_sum (wstring ws){
    int sum = 0;
    for (unsigned int i = 0; i < ws.length(); i++)
        sum += ws[i];
    return sum;
}

//"koduj" function
int _stdcall koduj (BSTR nr_id, int & x1){
    wstring ws_nr_id = BSTR_to_wstring(nr_id); …
Run Code Online (Sandbox Code Playgroud)

c++ dll excel vba excel-vba

7
推荐指数
1
解决办法
1万
查看次数

多列唯一约束中的列顺序有什么不同吗?有重复的索引是否合理?

在史蒂夫·奥赫恩 (Steve O'Hearn) 的“SQL 认证专家考试指南”中,我找到了这一段:

在创建复合索引以及调用同一索引的多个约束时,在极少数情况下,需要特殊语法。例如,如果我们决定在 INVOICES 表中的两个列上创建一个复合索引,我们可以使用以下语法:

CREATE TABLE invoices
(
    invoice_id    NUMBER(11),
    invoice_date  DATE,
    CONSTRAINT    un_invoices_invoice_id UNIQUE (invoice_id, invoice_date)
                  USING INDEX (CREATE INDEX ix_invoices
                                      ON invoices(invoice_id, invoice_date)),
    CONSTRAINT    un_invoices_invoice_date UNIQUE (invoice_date, invoice_id)
                  USING INDEX ix_invoices
);
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 创建两个唯一约束仅更改声明中的列顺序有什么意义?

  2. 我们创建了一个多列索引:“invoice_id”作为第一列,“invoice_date”作为第二列。但是让我们假设我们真的经常运行与“invoice_date”本身相关的查询,而没有“invoice_id”的参与。在“invoice_date”上创建第二个单列索引是个好主意吗?我知道:

由于 Oracle 支持多列索引,因此很容易意外创建“重复”索引,这些索引会增加 DML 的开销并且无助于加快 SQL 执行速度[来源]

我也知道:

由于跳过扫描引用复合索引中任何列的 WHERE 子句,可能会在处理过程中调用索引。[史蒂夫·奥赫恩]

但我也知道:

这不如简单的单列索引那么有益,它的好处因第一列中值的唯一性而异。[史蒂夫·奥赫恩]

因此,假设我们很少在此表上使用 DML 命令,并且假设我们与 SELECT 的 WHERE 子句中的两列相关,就像分别与“index_date”或“index_id”相关。在某些情况下,创建两个索引是否合理?一,多列索引,在(index_id,index_date)上,第二,单列索引,在(index_date)?

sql oracle indexing unique-constraint oracle11g

3
推荐指数
2
解决办法
2680
查看次数

是否可以通过makefile设置环境变量?

我想利用MALLOC_PERTURB_环境变量来更改内存分配参数(man 3 mallopt)。但是,我想在应用程序级别而不是整个系统级别上控制分配参数。理想情况下,如果我可以通过项目的makefile控制它们。我试图通过makefile更改提到的变量,但是没有成功。

为了进行测试,我创建了这个test.c文件:

#include<stdlib.h>
#include<stdio.h>

#define N 50

int main()
{
    char *chars;
    int i;

    if (NULL == (chars = malloc(N * sizeof(*chars))))
        return EXIT_FAILURE;

    free(chars);

    for (i = 0; i < N; ++i)
        printf("%c", chars[i]);
    printf("\n");

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道我正在从释放的内存中进行读取,但这是使用MALLOC_PERTURB_的全部重点。

预期结果:50个字符的ASCII字符,值MALLOC_PERTURB_。

足够近:

$ export MALLOC_PERTURB_=97
$ gcc test.c -o test
$ ./test
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa??


$ export MALLOC_PERTURB_=105
$ gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii??
Run Code Online (Sandbox Code Playgroud)

然后,我尝试将编译包含在makefile中,但没有成功。

导出变量 (如此处建议)

生成文件

all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

结果(我期望110个字母为n)

$ export …
Run Code Online (Sandbox Code Playgroud)

c unix malloc makefile gnu-make

3
推荐指数
1
解决办法
952
查看次数

模数运算与三元运算

我需要遍历n对整数:(0,1),(1,2),(2,3)......(n-2,n-1),(n-1,0)

最好的方法是什么?

  1. 使用模运算:

    for (int i = 0; i < n; i++){
        int a = i;
        int b = (i + 1)%n
        //MaaaanyLinesOfDoSomethingWithAAndB
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用三元运算:

    for (int i = 0; i < n; i++){
        int a = i;
        int b = (i + 1 == n ? 0 : i + 1)
        //MaaaanyLinesOfDoSomethingWithAAndB
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要么:

    for (int i = 0; i < n; i++){
        int a = i;
        int b = (i + 1 >= n ? 0 : i …
    Run Code Online (Sandbox Code Playgroud)

c c++ if-statement modulo

2
推荐指数
1
解决办法
699
查看次数