Tag: 数组

Java比C快吗?

到目前为止我听到的所有内容都是人们说Java通常比C慢,但有一些例外(比如涉及代码什么都不做)。 所以我出去测试它。 我有一个介于0和999,999之间的100,000个整数数组。 我在C和java(在OS X上编译)中使用了一个双循环来从最小到最大排序。 结果是Java通常在一半时间内完成。 在使用不同arrays的5次运行中,Java占用大约17秒,而C占用大约32秒(包括从文件中分配和填充arrays的时间,两者都可以忽略不计)。 那么什么会使Java代码比C运行得更快呢? 是否有我遗漏的东西,或者我听不到的一些基础技术? 编辑:也不确定它是否重要,但我使用time命令计时,而不是任何自定义代码。 例如: $time java SortArray 至于编译器选项,我现在无法访问该命令行,但它是OS X 10.10上的默认gcc选项: gcc sortarray.c -o sortarray 我只是使用默认的javac来编译Java。 javac SortArray.java C: #include #include #define SIZE 32 int main() { FILE* file = fopen(“bigarray.txt”, “r”); int arraySize = 100000; int array[100000] = {}; int i, j, temp; char inputBuffer[SIZE]; for (i = […]

如何检查结构是否已初始化?

我有一个表,我正在实现数据结构。 我的代码的一个重要块看起来像这样(h是数据结构,表是存储其他结构的表): (h->table[hash(key, h->size)] 当我的代码运行时,一些table [i]将被初始化,而有些则不会。 每当我在尚未初始化的表[i]上测试我的代码时,我得到一个valgrind错误,基本上我说我无法使用未初始化的数组。 我的问题是,我如何检查某个h-> table [i]是否已初始化?

在函数内部使用realloc扩展数组 – 指针?

我确信答案就是我不能正确理解指针和参考! 所以在我的C文件的开头我为人们定义了一个结构: typedef struct { char id[4]; int age; char name[128]; } people; 然后在main()内部创建一个由10 个人组成的数组,称为记录 。 people* record = (people*)malloc(sizeof(people)* 10); 在main()中我们开始然后潜入一个函数 MyFunction(record); (此函数在main()之前的C文件的开头具有原型 int MyFunction(people *record); 在MyFunction()内部,我们做了各种各样的事情,包括想要增加记录数组的大小,以便它可以容纳更多的人结构。 我试图增加记录数组大小 struct people *tmp = realloc(record, 20 * sizeof (people)); if (tmp) { record = tmp; } 但是这不起作用,如果我尝试在数组中使用新添加的结构,则会导致内存损坏。 正如我所说,我确信这是因为我没有正确地低估指针和参考。 请注意,我不能让MyFunction()将扩展记录数组作为其返回类型,因为我已经将其返回int用于其他内容(我不确定我是否也能正常工作!) -我需要它使用主记录数组。 有人能指出我正确的方向吗?

如何测试指针数组的结尾?

#include int main(void) { char *t[10]={“Program”, “hjl”,”juyy”}; int i; //printf(“%c \n”,*t[3]); int ch=*t[0]; for(i=0;*t[i]!=’\0′;i++){ printf(“%d”,i); } return 0; } 该计划在一段时间内停止了工作。 任何人都可以解释原因吗?

在C中,如何删除char数组中相同且连续的行?

我正在寻找一些创建函数的帮助。 函数deleteIdents()将删除char数组中的相同行,因为它们是连续的。 它将保持相同的一条线。 我不需要检查整行是否相同。 只有前79个字符,MAXCHARS,适用于这种情况。 因此,例如,如果我的数组包含 Hello World Hi World Hello World Hello World Hello World Hi there 它将被改为 Hello World Hi World Hello World Hi there 在我的脑海中,该function看起来类似于: int deleteIdents(char *a) { int i; for (i=0; i<=MAXCHARS; i++) { if (a[i] != '\n') /* copy into new array */ } } } 但我不确定。 如果你有一个解决方案,我会很高兴和感谢听到它:)

为什么我们不能像c中的指针那样以类似的方式递增数组?

#include int main(){ int arr[] = {1, 2, 3, 4}; int *p; p = arr; printf(“%d\n”, *p); printf(“%d\n”, *arr); p++; printf(“%d\n”, *p); } 此代码输出: 1 1 2 但是当我们添加2行时,如下所示: #include int main(){ int arr[] = {1, 2, 3, 4}; int *p; p = arr; printf(“%d\n”, *p); printf(“%d\n”, *arr); p++; printf(“%d\n”, *p); arr++; printf(“%d\n”, *arr); } 此代码输出: […]

从输入的字符数组中找到所有可能的单词(排列)

阅读了几篇文章之后,我仍然对排列和递归函数感到难过。 我试图在不等长的2D数组中创建所有可能的3个字母排列,其中第一个字母来自集合{‘l’,’m’,’n’},第二个字母来自集合{‘q ‘,’r’}和第三个字母来自集合{‘a’,’e’,’i’,’o’}。 我的代码经过了正确的排列模式,但没有打印出正确的输出。 例如,如果前8个排列应该是: lqa lqe lqi lqo lra lre lri lro 我的代码打印出来: lqa e i o ra e i o 关于问题是什么的任何想法? 以下是我的代码的相关部分: rec(character_pools,0,3); void rec(char** pool, int k, int j) { if(k==j) { printf(“\n”); return; } int i,len=strlen(pool[k]); for (i=0;i<len;i++) { printf("%c",pool[k][i]); rec(pool,k+1,j); } }

指向一组int的指针

有什么区别: //Example of “Complicated Array Declarations” from C++ Primer int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int (*Parr)[10] = &arr; 和: int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *Parr = arr; 两者都是指向整数数组的指针 。 但是为了在第一个片段中访问arr的第一个元素,我必须做**Parr而在第二个,我只需要取消引用一次*Parr

在C中的许多TQLI实现中是否存在错误?

用户Groo在这个问题的评论中发现,在南加利福尼亚大学高级计算和模拟合作实验室完成的C的TQLI实现中 ,存在一个非常基本的错误,即所有arrays都被视为一个 -根据。 虽然对我来说已经很奇怪,一个非常着名的机构会在其中一个代码中出现这样一个基本错误,但它让我更加困惑,基本上每个其他的TQLI算法实现和你可以在网上找到的相关tred2算法都能让同样的错误。 例子: TU Graz 斯坦福 这些不同的人真的有可能犯同样的错误,或者我错过了什么? 是否有一个版本的Carrays是基于1?

将未排序的连续字符串数组有效地排序到文件中

我有一个包含无序连续数字的字符串数组(范围从0到n),例如[7a, 1b, 2c, 0d, 6e, 5f, 3g, 4h] ,我想将数字按顺序写入文件。 例如: 0d 1b 2c 3g 4h 5f 6e 7a 字符串的长度不尽相同。 我试图找到一种方法,既快速又无需占用太多​​空间。 我找到了一种方法,我可以在O(n)空间复杂度和O(n)性能中做到这一点:我创建一个包含n个单元格的数组,并将每个字符串插入到他的单元格编号中。 for (i = 0; i < n; i++) sortedArray[originalArray[i]] = originalArray[i] …类似的东西(创建原始大小的新数组并在一次运行中填充),然后与另一个for循环将已排序数组的内容写入文件。 但我正在寻找一种更好的方法来做到这一点。