标签: size-t

将 size_t 与 -1 进行比较

注意:有人建议这个问题重复Can I Compare int with size_t direct in C? ,但这里的问题特别询问如何将 size_t 与负值进行比较。因此,应该重新开放。(此外,它还引发了很多深思熟虑的讨论!)

我正在盯着一些库代码(我正在看着你,Microchip),声明返回size_t

size_t SYS_FS_FileWrite(SYS_FS_HANDLE handle, const void *buf, size_t nbytes);
Run Code Online (Sandbox Code Playgroud)

这被记录为错误时返回 -1。但是size_t一个无符号值。那么,在理论上和/或实践中,以下行为是否允许?

if (SYS_FS_FileWrite(handle, buf, nbytes) == -1) {
    report_errror();
}
Run Code Online (Sandbox Code Playgroud)

c if-statement size-t type-conversion equality-operator

12
推荐指数
2
解决办法
1035
查看次数

C size_t和ssize_t负值

size_t被声明为unsigned int不能代表负值.
那么有ssize_t哪些是签名类型的size_t权利?
这是我的问题:

#include <stdio.h>
#include <sys/types.h>

int main(){
size_t a = -25;
ssize_t b = -30;
printf("%zu\n%zu\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我得到:

18446744073709551591
18446744073709551586
Run Code Online (Sandbox Code Playgroud)

结果?
我知道size_t这可能是因为它是一个无符号类型,但为什么我得到了错误的结果ssize_t

c size-t

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

施放ssize_t或size_t

在我在项目中使用的源文件中,有一个ssize_tsize_t变量之间的比较:

ssize_t sst;
size_t st;

if(sst == st){...}
Run Code Online (Sandbox Code Playgroud)

我想摆脱警告:

warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)

但我不确定,我应该向另一个转变哪个变量?

if((size_t)sst == st){...}
Run Code Online (Sandbox Code Playgroud)

要么

if(sst == (ssize_t)st){...}
Run Code Online (Sandbox Code Playgroud)

什么是更安全,更好,更清洁?谢谢

c++ casting size-t

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

为什么fgets接受int而不是size_t?

功能如strcpy(),malloc(),strlen()和各种人接受他们的观点或作为返回值size_t,而不是一个int或一个unsigned int显而易见的原因.

一些文件功能,如fread()fwrite()使用size_t.通过扩展,可以预期char* fgets (char *str, int num, FILE *stream)应该使用a size_t而不是intas作为其缓冲区大小的参数.

但是,fgets()用一个int.有客观解释为什么?

c size-t language-lawyer

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

在Ubuntu 8.1上,g ++ - 4.1或其他版本无法找到size_t

这件事发生在我之前,但我不记得我是如何修理它的.

我无法在新的Ubuntu安装上编译一些程序......我的标题出了点问题.

我试过g ++ - 4.1和4.3无济于事.

g++ -g -frepo  -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include  -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...
Run Code Online (Sandbox Code Playgroud)

文件...

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



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t …
Run Code Online (Sandbox Code Playgroud)

c++ linux header size-t

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

为什么size_t更好?

标题实际上有点误导,但我想保持简短.我已经读过为什么我应该使用size_t,我经常发现这样的语句:

size_t 保证能够表达任何对象的最大大小,包括任何数组

我真的不明白这意味着什么.是否可以一次分配多少内存,并且size_t保证足够大以计算该内存块中的每个字节?

后续问题:
什么决定了可以分配多少内存?

c implementation size-t

10
推荐指数
2
解决办法
1122
查看次数

C++中size_t的性能

我将这里的代码翻译成C++,如下所示

#include <iostream>

using namespace std;

int t = 20;

bool is_evenly_divisible(const int a, const int b) {
    for (int i=2; i<=b; ++i) { // Line 1
        if (a%i != 0)
            return false;
    }
    return true;
}

void run() {
    int i = 10;
    while (!is_evenly_divisible(i, t)) {
        i += 2;
    }
    cout << i << endl;
}

int main(int argc, char** argv) {
    run();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Mac OSX 10.8.4上使用编译器g ++ 4.8.1上的-O3标志,我得到0.568s用户时间.

现在,如果我将第1行中的计数器i在函数is_evenly_divisible中更改为size_t,则时间突然跳至1.588s.即使我将所有变量更改为size_t,这仍然存在,时间增加到1.646s

发生了什么?size_t不应该提高性能而不是降低性能,因为它比int更具体吗?

c++ int performance size-t c++11

10
推荐指数
1
解决办法
2855
查看次数

在For循环条件中向后迭代数组,当使用无符号整数导致无限循环时停止在0

我有一个循环,必须从j到0(包括).我的j变量的类型size_t通常是无符号的.

我的代码:

#include<stdio.h>
#include<conio.h>

#define SIZE 100

int main(){
    char str[SIZE];
    size_t i=0;
    size_t j;
    puts("Enter any string");
    scanf("%s",str);
    while(str[i]!='\0'){
        i++;
    }


    for(j=i-1;j>=0;j--){

        printf("%c",str[j]);
    }


    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个无限循环.如果我删除零的相等性,则输出不带第一个字母的字符串的反向.那么这里的问题是什么?

c size-t

10
推荐指数
4
解决办法
1775
查看次数

向size_t添加或指定整数文字

在CI中,可以看到许多代码为size_t变量添加或赋予整数文字.

size_t foo = 1;
foo += 1;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么转换,是否会发生a size_t被"升级"为a int然后转换回size_t?如果我在最大程度,那还会环绕吗?

size_t foo = SIZE_MAX;
foo += 1;
Run Code Online (Sandbox Code Playgroud)

这是定义的行为吗?它是一个无符号类型size_t,它int添加了一个符号(可能是一个更大的类型?)并转换回一个size_t.有签名整数溢出的风险吗?

写一些foo + bar + (size_t)1代替的东西是否有意义foo + bar + 1?我从来没有看到这样的代码,但我想知道整数促销是否有必要是否有必要.

C89没有说明size_t将如何排名或者究竟是什么:

结果的值是实现定义的,其类型(无符号整数类型)是在头中定义的size_t.

c size-t c89

10
推荐指数
1
解决办法
2251
查看次数

如何处理size_t与std :: size_t?

刚读过:

"std :: size_t"在C++中有意义吗?

我发现::size_t当你使用时,使用不符合标准(虽然我的编译器支持)#include <cstddef>.我想遵守标准,但我不想在std::size_t的所有标准之前.那么,处理这个问题的习惯/流行方式是什么:

  • using std::size_t;
  • 包括<stddef.h>
  • 只是依靠编译支持?
  • 别的什么?

c++ size-t

10
推荐指数
2
解决办法
1800
查看次数