我正在使用ATLAS进行LAPACK和多线程BLAS例程,并且注意到当我的矩阵足够大以致ATLAS使用BLAS的多线程版本时,我从Valgrind得到初始化错误.这是我的代码中的一个最小示例:
#include <stdio.h>
#include <stdlib.h>
extern void dgetrf_(int *, int *, double *, int *, int *, int *);
extern void dgetri_(int *, double *, int *, int *, double *, int *, int *);
extern void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
int main(void)
{
double *m1,*m2,*work,*temp;
int dim = 576;
int i,j,info;
int lwork = dim * dim; …Run Code Online (Sandbox Code Playgroud) 在学习C的过程中,我犯了一些错误并打印出未初始化的字符数组元素.
如果我将数组的大小扩展为相当大,比如说大小为100万个元素然后打印内容,那么出来的并不总是用户不可读,但似乎包含一些运行时信息.
请考虑以下代码:
#include <stdio.h>
main() {
char s[1000000];
int c, i;
printf("Enter input string:\n");
for (i = 0; ( c = getchar()) != '\n'; i++) {
s[i] = c;
}
printf("Contents of input string:\n");
for (i = 0; i < 999999; i++) {
putchar(s[i]);
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只需滚动输出,我会发现如下内容:
?? ?L' ?????? _ dyldVersionNumber_dyldVersionString_dyld_all_image_infos_dyld_fatal_error_dyld_shared_cache_ranges_error_string__mh_dylinker_header_stub_binding_helper_dyld_func_lookup_offset_to_dyld_all_image_infos__dyld_start__ZN13dyldbootstrapL30randomizeExecutableLoadAddressEPK12macho_headerPPKcPm__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl__ZN4dyldL17setNewProgramVarsERK11ProgramVars__ZN4dyld17getExecutablePathEv__ZN4dyld22mainExecutablePreboundEv__ZN4dyld14mainExecutableEv__ZN4dyld21findImageByMachHeaderEPK11mach_header__ZN4dyld26findImageContainingAddressEPKv
并且,
Apple Inc.1&0 $ U?0?*?H ?? CA0?"0ple Certification Authority10U?GP ?? GP ?? ^ y? - ?6?WLU ???? Kl ??"0?>?P? A ??????????????????????????????????????????????????????????????????????????????????? ?ˬ,运算δλ0 24 C'= …
我喜欢这样一个事实:Go并没有给我百万种方法来做简单的事情 - 借用Python的Zen,"应该有一个 - 最好只有一个 - 显而易见的方法."
但是,我不清楚实例化类型的首选/惯用方法.基本类型很简单:
n := 0
t := 1.5
str := "Hello"
Run Code Online (Sandbox Code Playgroud)
但是结构呢?以下是等效的,如果是,哪个是首选的,为什么?
var f Foo
f := Foo{}
Run Code Online (Sandbox Code Playgroud)
切片怎么样?我可以做var xs []int,xs := []int{}或者xs := make([]int),但我认为第一种选择(与结构相对)与其他选项不同?我认为这也适用于地图.
有了指针,我听说new应该避免.这是一个很好的建议,如果是的话,什么才算是有效的用法new?
我意识到这可能部分是风格问题,但在任何情况下,选择特定风格的理由都会有所帮助.
这个问题出现在问题答案的评论中.当类型转换为int时,C/C++ bool类型总是保证为0或1吗?
有问题的代码在bool不初始化其值的情况下分配(本地)数组.
const int n = 100;
bool b[n];
Run Code Online (Sandbox Code Playgroud)
显然,价值观b是不确定的.
一些评论者认为阅读b[0]是不明确的行为.这是在C++标准中的任何地方陈述的吗?我仍然相信相反:
显然存储已分配,并且基本bool类型的初始化已完成,因为它没有构造函数.因此,它肯定与取消引用未初始化的指针或在未初始化的非平凡对象上调用方法/强制转换操作符不同.标准似乎涵盖了这些具体案例.
C中的行为确实未定义:C中声明的未初始化变量会发生什么?它有价值吗?一些受访者似乎对这两者感到困惑.
在最新的C++ 0x草案中,我找不到不确定值的定义,尤其是没有允许访问这样的值来触发处理器陷阱的定义.事实上,Bjarne的Stroustrup的是不知道的inderminate值可能是什么:http://zamanbakshifirst.blogspot.com/2007/02/c-indeterminate-value.html
当我们创建一个变量并且不对其进行初始化时,会为其分配一些称为垃圾值的(随机)数字.
c compiler-construction variables programming-languages initialization
我一直以为C不接受NULL参数,直到我开始学习指针.在某些编程语言中,如python for one,可以将NULL参数作为参数传递,但在CI中始终认为这会导致未定义的行为.
我的问题只是一个好奇心,一个功能怎么可能,比如...
waitpid(child_pid, &status, options); //pointer &status
Run Code Online (Sandbox Code Playgroud)
...接受一个NULL指针作为参数而不会运行到未定义的行为,不是NULL指针只是指向什么?
简单地说,为什么这在C中可以接受?
可能重复:
C中声明的未初始化变量会发生什么?它有价值吗?
现在我正在读书Teach Yourself C in 21 Days.在第3章中,有一个这样的说明:
请勿使用尚未初始化的变量.结果可能无法预测.
请向我解释为什么会这样.该书没有提供进一步的说明.
我想知道实际情况是什么,编译器如何处理静态变量.与自动变量不同,静态变量的值即使在块结束后仍然存在,但编译器实际上如何处理这个?
我正在阅读Gilles Dowek的编程原理:
他说,也可以在不给它初始值的情况下声明变量,并且我们必须小心不要使用已经声明没有初始值并且没有赋值的变量.这会产生错误.
注意:本书的作者提到在Java上声明没有初始值的变量的可能性.
那么,为什么这个变量声明有效呢?我什么时候开始使用它?