直到今天,我仍然相信,调用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) 我在使用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) …
我创建了一个包含名为"koduj"的函数的DLL.通过在Excel工作表单元格中使用它来调用此函数将返回所需的结果.从VBA调用"koduj"会返回错误的答案.
koduj需要两个参数:string nr_id和integer 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) 在史蒂夫·奥赫恩 (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)
这是我的问题:
创建两个唯一约束仅更改声明中的列顺序有什么意义?
我们创建了一个多列索引:“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)?
我想利用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) 我需要遍历n对整数:(0,1),(1,2),(2,3)......(n-2,n-1),(n-1,0)
最好的方法是什么?
使用模运算:
for (int i = 0; i < n; i++){
int a = i;
int b = (i + 1)%n
//MaaaanyLinesOfDoSomethingWithAAndB
}
Run Code Online (Sandbox Code Playgroud)使用三元运算:
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)要么:
for (int i = 0; i < n; i++){
int a = i;
int b = (i + 1 >= n ? 0 : i …Run Code Online (Sandbox Code Playgroud)